From 82389a749a1f2cef9f083558e98d74137685552d Mon Sep 17 00:00:00 2001 From: Oleksandr Saulyak Date: Tue, 20 May 2025 23:10:43 +0300 Subject: [PATCH 01/13] chore: sync all codefresh code changes into v3.0.2 (#397) * chore: sync all codefresh code changes into v3.0.2 without event-reporter related changes Signed-off-by: oleksandr-codefresh * removed cf script Signed-off-by: oleksandr-codefresh * upgraded git-lfs to 3.6.1 in Dockerfile (#386) Signed-off-by: reggie-k Signed-off-by: oleksandr-codefresh * fixed webstorm go.mod issue Signed-off-by: oleksandr-codefresh * e2e: improved error logs Signed-off-by: oleksandr-codefresh * fixed changes on generated files Signed-off-by: oleksandr-codefresh * chore: replace heptio-images with argocd-e2e-container (#23040) Signed-off-by: nitishfy Signed-off-by: Nitish Kumar (cherry picked from commit 309acd161c7cf20e99970f06d04efc4eb78a00a9) Signed-off-by: oleksandr-codefresh * feat: upgraded github.com/expr-lang/expr from 0.16.9 to 0.17.0 Signed-off-by: oleksandr-codefresh * e2e [TestTrackAppStateAndSyncApp / TestNewStyleResourceActionMixedOk / TestNewStyleResourceActionPermitted / TestNamespacedPermissions]: added wait for sync operation Signed-off-by: oleksandr-codefresh --------- Signed-off-by: oleksandr-codefresh Signed-off-by: reggie-k Co-authored-by: Regina Voloshin Co-authored-by: Nitish Kumar # Conflicts: # .github/workflows/ci-build.yaml # cmd/argocd/commands/app_test.go # go.mod # go.sum # manifests/base/kustomization.yaml # manifests/core-install-with-hydrator.yaml # manifests/core-install.yaml # manifests/core-install/kustomization.yaml # manifests/ha/base/kustomization.yaml # manifests/ha/install-with-hydrator.yaml # manifests/ha/install.yaml # manifests/ha/namespace-install-with-hydrator.yaml # manifests/ha/namespace-install.yaml # manifests/install-with-hydrator.yaml # manifests/install.yaml # manifests/namespace-install-with-hydrator.yaml # manifests/namespace-install.yaml # pkg/apiclient/application/application.pb.go # pkg/apiclient/application/application.pb.gw.go # pkg/apis/application/v1alpha1/generated.pb.go # reposerver/apiclient/mocks/RepoServerServiceClient.go # reposerver/apiclient/repository.pb.go # server/application/application.proto # util/git/mocks/Client.go --- .dockerignore | 2 + .github/ISSUE_TEMPLATE/config.yml | 2 +- .github/workflows/ci-build.yaml | 18 +- .github/workflows/image.yaml | 34 +- .mockery.yaml | 3 + Dockerfile | 10 +- Dockerfile.dev | 1 + Makefile | 3 +- Merge-upstream.md | 60 + acr_controller/application/client.go | 96 + .../application/mocks/ApplicationClient.go | 127 + acr_controller/controller/broadcaster.go | 107 + acr_controller/controller/controller.go | 81 + acr_controller/server.go | 206 + acr_controller/service/acr_service.go | 202 + acr_controller/service/acr_service_test.go | 318 ++ argocd-cosign.pub | 4 + assets/swagger.json | 3 + .../application_change_revision_controller.go | 158 + .../commands/common.go | 6 + cmd/argocd/commands/app_test.go | 12 + cmd/main.go | 3 + common/cf_common.go | 44 + controller/state.go | 2 +- controller/sync.go | 5 + docs/proposals/manifest-hydrator.md | 2 +- hack/goreman-start.sh | 2 +- hack/update-manifests.sh | 9 +- .../acr-controller-deployment.yaml | 88 + .../acr-controller/acr-controller-role.yaml | 43 + .../acr-controller-rolebinding.yaml | 15 + .../acr-controller/acr-controller-sa.yaml | 8 + .../base/acr-controller/kustomization.yaml | 8 + .../base/commit-server/kustomization.yaml | 2 +- manifests/base/kustomization.yaml | 2 +- manifests/core-install-with-hydrator.yaml | 24 +- manifests/core-install.yaml | 22 +- manifests/core-install/kustomization.yaml | 2 +- manifests/crds/application-crd.yaml | 12 + manifests/ha/base/kustomization.yaml | 3 +- manifests/ha/install-with-hydrator.yaml | 30 +- manifests/ha/install.yaml | 28 +- .../ha/namespace-install-with-hydrator.yaml | 18 +- manifests/ha/namespace-install.yaml | 16 +- manifests/install-with-hydrator.yaml | 30 +- manifests/install.yaml | 28 +- .../namespace-install-with-hydrator.yaml | 18 +- manifests/namespace-install.yaml | 16 +- pkg/apiclient/application/application.pb.go | 3502 ++++++++++++----- pkg/apis/application/v1alpha1/cf_types.go | 46 + pkg/apis/application/v1alpha1/generated.pb.go | 1570 ++++---- pkg/apis/application/v1alpha1/generated.proto | 2 + pkg/apis/application/v1alpha1/types.go | 6 +- .../v1alpha1/zz_generated.deepcopy.go | 5 + .../mocks/RepoServerServiceClient.go | 87 + reposerver/apiclient/repository.pb.go | 979 ++++- reposerver/repository/cf_repository.go | 105 + reposerver/repository/repository.go | 26 +- reposerver/repository/repository.proto | 18 + reposerver/repository/testdata/symlinks/bam | 1 + reposerver/repository/testdata/symlinks/bar | 1 + reposerver/repository/testdata/symlinks/baz | 1 + reposerver/repository/testdata/symlinks/foo | 1 + .../ResourceRecordSet/heatlh.lua | 41 + server/application/application.go | 6 +- server/application/application.proto | 811 ++-- .../application_rollout_rollback.go | 225 ++ .../application_validate_src_and_dest.go | 94 + server/application/cf_application.go | 61 + server/repository/repository.go | 2 +- sonar-project.properties | 8 +- test/e2e/app_management_ns_test.go | 2 + test/e2e/app_management_test.go | 3 + test/e2e/fixture/app/expectation.go | 2 +- test/e2e/project_management_test.go | 4 + .../Chart.yaml | 6 +- util/argo/argo.go | 2 +- util/git/cf_client.go | 46 + util/git/client.go | 2 + util/git/mocks/Client.go | 130 + util/kustomize/cf_kustomize.go | 60 + util/kustomize/kustomize.go | 18 +- util/kustomize/kustomize_test.go | 20 +- util/kustomize/repospec.go | 151 + util/kustomize/repospec_test.go | 250 ++ util/notification/argocd/service.go | 2 +- util/settings/cf_settings.go | 13 + util/settings/settings.go | 7 +- util/settings/settings_test.go | 8 +- 89 files changed, 7847 insertions(+), 2410 deletions(-) create mode 100644 Merge-upstream.md create mode 100644 acr_controller/application/client.go create mode 100644 acr_controller/application/mocks/ApplicationClient.go create mode 100644 acr_controller/controller/broadcaster.go create mode 100644 acr_controller/controller/controller.go create mode 100644 acr_controller/server.go create mode 100644 acr_controller/service/acr_service.go create mode 100644 acr_controller/service/acr_service_test.go create mode 100644 argocd-cosign.pub create mode 100644 cmd/application-change-revision-controller/commands/application_change_revision_controller.go create mode 100644 cmd/application-change-revision-controller/commands/common.go create mode 100644 common/cf_common.go create mode 100644 manifests/base/acr-controller/acr-controller-deployment.yaml create mode 100644 manifests/base/acr-controller/acr-controller-role.yaml create mode 100644 manifests/base/acr-controller/acr-controller-rolebinding.yaml create mode 100644 manifests/base/acr-controller/acr-controller-sa.yaml create mode 100644 manifests/base/acr-controller/kustomization.yaml create mode 100644 pkg/apis/application/v1alpha1/cf_types.go create mode 100644 reposerver/repository/cf_repository.go create mode 120000 reposerver/repository/testdata/symlinks/bam create mode 120000 reposerver/repository/testdata/symlinks/bar create mode 120000 reposerver/repository/testdata/symlinks/baz create mode 100644 reposerver/repository/testdata/symlinks/foo create mode 100644 resource_customizations/route53.aws.crossplane.io/ResourceRecordSet/heatlh.lua create mode 100644 server/application/application_rollout_rollback.go create mode 100644 server/application/application_validate_src_and_dest.go create mode 100644 server/application/cf_application.go create mode 100644 util/git/cf_client.go create mode 100644 util/kustomize/cf_kustomize.go create mode 100644 util/kustomize/repospec.go create mode 100644 util/kustomize/repospec_test.go create mode 100644 util/settings/cf_settings.go diff --git a/.dockerignore b/.dockerignore index e778fce267438..12e17715871ca 100644 --- a/.dockerignore +++ b/.dockerignore @@ -17,6 +17,8 @@ manifests/ hack/ docs/ examples/ +.dockerignore +.git/ .github/ !test/container !test/e2e/testdata diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index b306343920656..4ddcc9e3afb64 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -5,7 +5,7 @@ contact_links: url: https://argo-cd.readthedocs.io/ about: Much help can be found in the docs - name: Ask a question - url: https://github.com/argoproj/argo-cd/discussions/new + url: https://github.com/codefresh-io/argo-cd/discussions/new about: Ask a question or start a discussion about Argo CD - name: Chat on Slack url: https://argoproj.github.io/community/join-slack diff --git a/.github/workflows/ci-build.yaml b/.github/workflows/ci-build.yaml index aaca11eb6f527..3ad1af6e742bd 100644 --- a/.github/workflows/ci-build.yaml +++ b/.github/workflows/ci-build.yaml @@ -2,14 +2,16 @@ name: Integration tests on: push: branches: - - 'master' - - 'release-*' - - '!release-1.4' - - '!release-1.5' + - 'sync-*' + # - 'master' + # - 'release-*' + # - '!release-1.4' + # - '!release-1.5' pull_request: branches: - - 'master' - - 'release-*' + - 'sync-*' + # - 'master' + # - 'release-*' env: # Golang version to use across CI steps @@ -392,7 +394,7 @@ jobs: env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} - name: Upload test results to Codecov - if: github.ref == 'refs/heads/master' && github.event_name == 'push' && github.repository == 'argoproj/argo-cd' + if: startsWith(github.ref, 'refs/heads/sync-') && github.event_name == 'push' && github.repository == 'codefresh-io/argo-cd' uses: codecov/test-results-action@47f89e9acb64b76debcd5ea40642d25a4adced9f # v1.1.1 with: file: test-results/junit.xml @@ -403,7 +405,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} uses: SonarSource/sonarqube-scan-action@2500896589ef8f7247069a56136f8dc177c27ccf # v5.2.0 - if: env.sonar_secret != '' + if: false && env.sonar_secret != '' test-e2e: name: Run end-to-end tests if: ${{ needs.changes.outputs.backend == 'true' }} diff --git a/.github/workflows/image.yaml b/.github/workflows/image.yaml index 8389f703f9656..3994c284bbf11 100644 --- a/.github/workflows/image.yaml +++ b/.github/workflows/image.yaml @@ -3,10 +3,10 @@ name: Image on: push: branches: - - master + - sync-* pull_request: branches: - - master + - sync-* types: [labeled, unlabeled, opened, synchronize, reopened] concurrency: @@ -19,17 +19,25 @@ jobs: set-vars: permissions: contents: read - if: github.repository == 'argoproj/argo-cd' + if: github.repository == 'codefresh-io/argo-cd' runs-on: ubuntu-22.04 outputs: - image-tag: ${{ steps.image.outputs.tag}} + image-tag: ${{ steps.image-pr.outputs.tag || steps.image-push.outputs.tag }} platforms: ${{ steps.platforms.outputs.platforms }} steps: - uses: actions/checkout@8410ad0602e1e429cee44a835ae9f77f654a6694 # v4.0.0 - - name: Set image tag for ghcr - run: echo "tag=$(cat ./VERSION)-${GITHUB_SHA::8}" >> $GITHUB_OUTPUT - id: image + - name: Set image tag (push to feature branch) + if: ${{ github.repository == 'codefresh-io/argo-cd' && github.event_name == 'pull_request' }} + run: | + CLEAN_REF=$(echo "${{ github.head_ref }}" | sed 's|^refs/[^/]*||; s|/|_|g') + echo "tag=v$(cat ./VERSION)-${CLEAN_REF}-${GITHUB_SHA::8}" >> $GITHUB_OUTPUT + id: image-pr + + - name: Set image tag (push to sync-* branch) + if: ${{ github.repository == 'codefresh-io/argo-cd' && github.event_name == 'push' }} + run: echo "tag=v$(cat ./VERSION)-$(date +%Y-%m-%d)-${GITHUB_SHA::8}" >> $GITHUB_OUTPUT + id: image-push - name: Determine image platforms to use id: platforms @@ -48,7 +56,7 @@ jobs: contents: read packages: write # for pushing packages to GHCR, which is used by cd.apps.argoproj.io to avoid polluting Quay with tags id-token: write # for creating OIDC tokens for signing. - if: ${{ github.repository == 'argoproj/argo-cd' && github.event_name != 'push' }} + if: ${{ false }} uses: ./.github/workflows/image-reuse.yaml with: # Note: cannot use env variables to set go-version (https://docs.github.com/en/actions/using-workflows/reusing-workflows#limitations) @@ -63,11 +71,11 @@ jobs: contents: read packages: write # for pushing packages to GHCR, which is used by cd.apps.argoproj.io to avoid polluting Quay with tags id-token: write # for creating OIDC tokens for signing. - if: ${{ github.repository == 'argoproj/argo-cd' && github.event_name == 'push' }} + if: ${{ github.repository == 'codefresh-io/argo-cd' }} uses: ./.github/workflows/image-reuse.yaml with: - quay_image_name: quay.io/argoproj/argocd:latest - ghcr_image_name: ghcr.io/argoproj/argo-cd/argocd:${{ needs.set-vars.outputs.image-tag }} + quay_image_name: ${{ github.event_name == 'pull_request' && 'quay.io/codefresh/dev/argocd' || 'quay.io/codefresh/argocd' }}:${{ needs.set-vars.outputs.image-tag }} + # ghcr_image_name: ghcr.io/codefresh-io/argo-cd/argocd:${{ needs.set-vars.outputs.image-tag }} # Note: cannot use env variables to set go-version (https://docs.github.com/en/actions/using-workflows/reusing-workflows#limitations) # renovate: datasource=golang-version packageName=golang go-version: 1.24.6 @@ -86,7 +94,7 @@ jobs: actions: read # for detecting the Github Actions environment. id-token: write # for creating OIDC tokens for signing. packages: write # for uploading attestations. (https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#known-issues) - if: ${{ github.repository == 'argoproj/argo-cd' && github.event_name == 'push' }} + if: ${{ false }} # Must be refernced by a tag. https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#referencing-the-slsa-generator uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v2.1.0 with: @@ -103,7 +111,7 @@ jobs: permissions: contents: write # for git to push upgrade commit if not already deployed packages: write # for pushing packages to GHCR, which is used by cd.apps.argoproj.io to avoid polluting Quay with tags - if: ${{ github.repository == 'argoproj/argo-cd' && github.event_name == 'push' }} + if: ${{ false }} runs-on: ubuntu-22.04 steps: - uses: actions/checkout@8410ad0602e1e429cee44a835ae9f77f654a6694 # v4.0.0 diff --git a/.mockery.yaml b/.mockery.yaml index 5a25211e49be0..34c469614a095 100644 --- a/.mockery.yaml +++ b/.mockery.yaml @@ -7,6 +7,9 @@ template-data: unroll-variadic: true packages: + github.com/argoproj/argo-cd/v3/acr_controller/application: + interfaces: + ApplicationClient: github.com/argoproj/argo-cd/v3/applicationset/generators: interfaces: Generator: {} diff --git a/Dockerfile b/Dockerfile index 1a4c881061500..b764b44bce732 100644 --- a/Dockerfile +++ b/Dockerfile @@ -43,15 +43,18 @@ USER root ENV ARGOCD_USER_ID=999 \ DEBIAN_FRONTEND=noninteractive -RUN groupadd -g $ARGOCD_USER_ID argocd && \ +RUN apt-get update && \ + apt-get install curl -y && \ + curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash && \ + apt-get install git-lfs -y && \ + groupadd -g $ARGOCD_USER_ID argocd && \ useradd -r -u $ARGOCD_USER_ID -g argocd argocd && \ mkdir -p /home/argocd && \ chown argocd:0 /home/argocd && \ chmod g=u /home/argocd && \ - apt-get update && \ apt-get dist-upgrade -y && \ apt-get install -y \ - git git-lfs tini gpg tzdata connect-proxy && \ + git tini gpg tzdata connect-proxy && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* @@ -138,6 +141,7 @@ COPY --from=argocd-build /go/src/github.com/argoproj/argo-cd/dist/argocd* /usr/l USER root RUN ln -s /usr/local/bin/argocd /usr/local/bin/argocd-server && \ ln -s /usr/local/bin/argocd /usr/local/bin/argocd-repo-server && \ + ln -s /usr/local/bin/argocd /usr/local/bin/argocd-application-change-revision-controller && \ ln -s /usr/local/bin/argocd /usr/local/bin/argocd-cmp-server && \ ln -s /usr/local/bin/argocd /usr/local/bin/argocd-application-controller && \ ln -s /usr/local/bin/argocd /usr/local/bin/argocd-dex && \ diff --git a/Dockerfile.dev b/Dockerfile.dev index 978304f80fc44..2147433de9732 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -7,6 +7,7 @@ COPY argocd /usr/local/bin/ USER root RUN ln -s /usr/local/bin/argocd /usr/local/bin/argocd-server && \ ln -s /usr/local/bin/argocd /usr/local/bin/argocd-repo-server && \ + ln -s /usr/local/bin/argocd /usr/local/bin/argocd-application-change-revision-controller && \ ln -s /usr/local/bin/argocd /usr/local/bin/argocd-application-controller && \ ln -s /usr/local/bin/argocd /usr/local/bin/argocd-dex && \ ln -s /usr/local/bin/argocd /usr/local/bin/argocd-notifications && \ diff --git a/Makefile b/Makefile index 77e4690bf0bec..fc6a4a04144c5 100644 --- a/Makefile +++ b/Makefile @@ -134,6 +134,7 @@ define run-in-test-client -e GITHUB_TOKEN \ -e GOCACHE=/tmp/go-build-cache \ -e ARGOCD_LINT_GOGC=$(ARGOCD_LINT_GOGC) \ + -e GOSUMDB=off \ -v ${DOCKER_SRC_MOUNT} \ -v ${GOPATH}/pkg/mod:/go/pkg/mod${VOLUME_MOUNT} \ -v ${GOCACHE}:/tmp/go-build-cache${VOLUME_MOUNT} \ @@ -154,7 +155,7 @@ PATH:=$(PATH):$(PWD)/hack # docker image publishing options DOCKER_PUSH?=false -IMAGE_NAMESPACE?= +IMAGE_NAMESPACE?=quay.io/codefresh # perform static compilation DEFAULT_STATIC_BUILD:=true ifeq ($(IS_DARWIN),true) diff --git a/Merge-upstream.md b/Merge-upstream.md new file mode 100644 index 0000000000000..7c7ea117dc2b8 --- /dev/null +++ b/Merge-upstream.md @@ -0,0 +1,60 @@ +## Process of merging upstream changes + +1. create "sync-3.0.2" branch on top of upstream v3.0.2 tag (git checkout -b sync-3.0.2 v3.0.2), push to codefresh-io/argocd +2. create branch "make-cf-changes" on current release (sync-2.14.9 HEAD) +3. rebase onto sync-3.0.2 ("git rebase --onto sync-3.0.2 v2.14.9 make-cf-changes) +4. make a pr from "make-cf-changes" into "sync-3.0.2". + 1. the pr will trigger dev image builds, e2e runs, etc (quay.io/codefresh/dev/argocd) +5. fix conflicts, test, fixes, whatever (by instuction in following section) +6. merge pr + 1. merge will create official image of fork (quay.io/codefresh/argocd) + 2. manually create tag "v3.0.2-YYYY-MM-DD-SHA" + 3. THERE IS NOT GITHUB RELEASE + +## Resolving conflicts during upstream changes merge + +This docs include info about places where codefresh made it's customizations: + +#### General notes: +1. All files that're deleted in our branches - we can keep deleted (accept ours). +2. all `xxx.pb.go` - apply theirs and after resolving conflicts re-generate. + +#### Paths and actions on them +1. `.github/workflows` - accept ours (yours). +2. `applicationset` - accept theirs +3. `assets / swagger` - accept ours. Later run codegen and commit new version +4. `cmd / argocd` - accept ours if files deleted. +5. `cmd / argocd-application-controller` - no custom thing from our side, so just resolve conflicts. +6. `cmd / notifications` - no custom thing from our side, so just accept theirs. +7. `cmd / argocd-repo-server` - includes our changes with codefresh related parameters. +8. `cmd / common` - includes our changes with codefresh related constants (event-reporter) +9. `cmd / controller / application.go` - includes our changes to resource node (to return labels and annotations getResourceTree method) +10. `cmd / controller / state.go` - includes our changes (GetRepoObjs method) +11. `cmd / controller / state_test.go - includes our changes. Replace manifest values with our struct `apiclient.Manifest` +12. `docs` - apply theirs +13. `examples` - apply theirs +14. `hack` - apply theirs +15. `manifests` - accept theirs +16. `notification_controller` - apply theirs +17. `pkg/apis/application/v1alpha` - generatedXXX - apply theirs (than re-generate). types.go - merge (includes our changes with ForceNamespace). +18. `server / application.go` - merge (includes our v1 event-reporter.) +19. `ui` - accept theirs. +20. `util / kustomize` - merge, as it includes ours changes. +21. `mkdocs.yaml` - apply theirs. +22. `go.mod` - merge direct dependencies. go.sum accept theirs. Run go mod tidy. Check `replace` section, perform cleanup if needed. +23. `reposerver / sepository.go` - merge, includes: cf appVersion logic; type manifest struct (with path to file, rawManifest); + + +#### Post actions: +1. run `go mod tidy` +2. run `go mod download` +3. run `go mod vendor` +4. run `make install-tools-local` +5. run `make lint-local` +6. run `make protogen-fast` - because sometimes gogen won't work if types from protogen used +7. run `make codegen` +8. run `make test-local` + +### Thoughts + +1. Revert cherry picks before merges - as they cause issues later if in upstream decided to slightly move some parts of such changes. In this case no conflicts will occur during merge as they on different lines but then you need cleanup them manually. \ No newline at end of file diff --git a/acr_controller/application/client.go b/acr_controller/application/client.go new file mode 100644 index 0000000000000..bd2a23cda7ede --- /dev/null +++ b/acr_controller/application/client.go @@ -0,0 +1,96 @@ +package application_change_revision_controller + +import ( + "context" + "crypto/tls" + "encoding/json" + "fmt" + "io" + "net/http" + "strings" + "time" + + "google.golang.org/grpc" + + appclient "github.com/argoproj/argo-cd/v3/pkg/apiclient/application" +) + +type ApplicationClient interface { + GetChangeRevision(ctx context.Context, in *appclient.ChangeRevisionRequest, opts ...grpc.CallOption) (*appclient.ChangeRevisionResponse, error) +} + +type httpApplicationClient struct { + httpClient *http.Client + baseURL string + token string + rootpath string +} + +func NewHTTPApplicationClient(token string, address string, rootpath string) ApplicationClient { + if rootpath != "" && !strings.HasPrefix(rootpath, "/") { + rootpath = "/" + rootpath + } + + if !strings.Contains(address, "http") { + address = "http://" + address + } + + if rootpath != "" { + address = address + rootpath + } + + return &httpApplicationClient{ + httpClient: &http.Client{ + Timeout: 30 * time.Second, + Transport: &http.Transport{ + // Support for insecure connections + TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, + }, + }, + baseURL: address, + token: token, + rootpath: rootpath, + } +} + +func (c *httpApplicationClient) execute(ctx context.Context, url string, result any) error { + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) + if err != nil { + return err + } + + req.Header.Set("Content-Type", "application/json") + req.Header.Set("Authorization", "Bearer "+c.token) + + res, err := c.httpClient.Do(req) + if err != nil { + return err + } + defer res.Body.Close() + + b, _ := io.ReadAll(res.Body) + + isStatusOK := res.StatusCode >= 200 && res.StatusCode < 300 + if !isStatusOK { + return fmt.Errorf("argocd server respond with code %d, msg is: %s", res.StatusCode, string(b)) + } + + err = json.Unmarshal(b, &result) + if err != nil { + return err + } + return nil +} + +func (c *httpApplicationClient) GetChangeRevision(ctx context.Context, in *appclient.ChangeRevisionRequest, _ ...grpc.CallOption) (*appclient.ChangeRevisionResponse, error) { + params := fmt.Sprintf("?appName=%s&namespace=%s¤tRevision=%s&previousRevision=%s", in.GetAppName(), in.GetNamespace(), in.GetCurrentRevision(), in.GetPreviousRevision()) + + url := fmt.Sprintf("%s/api/v1/application/changeRevision%s", c.baseURL, params) + + changeRevisionResponse := &appclient.ChangeRevisionResponse{} + err := c.execute(ctx, url, changeRevisionResponse) + if err != nil { + return nil, err + } + return changeRevisionResponse, nil +} diff --git a/acr_controller/application/mocks/ApplicationClient.go b/acr_controller/application/mocks/ApplicationClient.go new file mode 100644 index 0000000000000..0650416b42245 --- /dev/null +++ b/acr_controller/application/mocks/ApplicationClient.go @@ -0,0 +1,127 @@ +// Code generated by mockery; DO NOT EDIT. +// github.com/vektra/mockery +// template: testify + +package mocks + +import ( + "context" + + "github.com/argoproj/argo-cd/v3/pkg/apiclient/application" + mock "github.com/stretchr/testify/mock" + "google.golang.org/grpc" +) + +// NewApplicationClient creates a new instance of ApplicationClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewApplicationClient(t interface { + mock.TestingT + Cleanup(func()) +}) *ApplicationClient { + mock := &ApplicationClient{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} + +// ApplicationClient is an autogenerated mock type for the ApplicationClient type +type ApplicationClient struct { + mock.Mock +} + +type ApplicationClient_Expecter struct { + mock *mock.Mock +} + +func (_m *ApplicationClient) EXPECT() *ApplicationClient_Expecter { + return &ApplicationClient_Expecter{mock: &_m.Mock} +} + +// GetChangeRevision provides a mock function for the type ApplicationClient +func (_mock *ApplicationClient) GetChangeRevision(ctx context.Context, in *application.ChangeRevisionRequest, opts ...grpc.CallOption) (*application.ChangeRevisionResponse, error) { + // grpc.CallOption + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _mock.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for GetChangeRevision") + } + + var r0 *application.ChangeRevisionResponse + var r1 error + if returnFunc, ok := ret.Get(0).(func(context.Context, *application.ChangeRevisionRequest, ...grpc.CallOption) (*application.ChangeRevisionResponse, error)); ok { + return returnFunc(ctx, in, opts...) + } + if returnFunc, ok := ret.Get(0).(func(context.Context, *application.ChangeRevisionRequest, ...grpc.CallOption) *application.ChangeRevisionResponse); ok { + r0 = returnFunc(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*application.ChangeRevisionResponse) + } + } + if returnFunc, ok := ret.Get(1).(func(context.Context, *application.ChangeRevisionRequest, ...grpc.CallOption) error); ok { + r1 = returnFunc(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + return r0, r1 +} + +// ApplicationClient_GetChangeRevision_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetChangeRevision' +type ApplicationClient_GetChangeRevision_Call struct { + *mock.Call +} + +// GetChangeRevision is a helper method to define mock.On call +// - ctx context.Context +// - in *application.ChangeRevisionRequest +// - opts ...grpc.CallOption +func (_e *ApplicationClient_Expecter) GetChangeRevision(ctx interface{}, in interface{}, opts ...interface{}) *ApplicationClient_GetChangeRevision_Call { + return &ApplicationClient_GetChangeRevision_Call{Call: _e.mock.On("GetChangeRevision", + append([]interface{}{ctx, in}, opts...)...)} +} + +func (_c *ApplicationClient_GetChangeRevision_Call) Run(run func(ctx context.Context, in *application.ChangeRevisionRequest, opts ...grpc.CallOption)) *ApplicationClient_GetChangeRevision_Call { + _c.Call.Run(func(args mock.Arguments) { + var arg0 context.Context + if args[0] != nil { + arg0 = args[0].(context.Context) + } + var arg1 *application.ChangeRevisionRequest + if args[1] != nil { + arg1 = args[1].(*application.ChangeRevisionRequest) + } + var arg2 []grpc.CallOption + variadicArgs := make([]grpc.CallOption, len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(grpc.CallOption) + } + } + arg2 = variadicArgs + run( + arg0, + arg1, + arg2..., + ) + }) + return _c +} + +func (_c *ApplicationClient_GetChangeRevision_Call) Return(changeRevisionResponse *application.ChangeRevisionResponse, err error) *ApplicationClient_GetChangeRevision_Call { + _c.Call.Return(changeRevisionResponse, err) + return _c +} + +func (_c *ApplicationClient_GetChangeRevision_Call) RunAndReturn(run func(ctx context.Context, in *application.ChangeRevisionRequest, opts ...grpc.CallOption) (*application.ChangeRevisionResponse, error)) *ApplicationClient_GetChangeRevision_Call { + _c.Call.Return(run) + return _c +} diff --git a/acr_controller/controller/broadcaster.go b/acr_controller/controller/broadcaster.go new file mode 100644 index 0000000000000..fa80d0620b756 --- /dev/null +++ b/acr_controller/controller/broadcaster.go @@ -0,0 +1,107 @@ +package application_change_revision_controller + +import ( + "sync" + + log "github.com/sirupsen/logrus" + "k8s.io/apimachinery/pkg/watch" + + appv1 "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" +) + +type subscriber struct { + ch chan *appv1.ApplicationWatchEvent + filters []func(*appv1.ApplicationWatchEvent) bool +} + +func (s *subscriber) matches(event *appv1.ApplicationWatchEvent) bool { + for i := range s.filters { + if !s.filters[i](event) { + return false + } + } + return true +} + +// Broadcaster is an interface for broadcasting application informer watch events to multiple subscribers. +type Broadcaster interface { + Subscribe(ch chan *appv1.ApplicationWatchEvent, filters ...func(event *appv1.ApplicationWatchEvent) bool) func() + OnAdd(any, bool) + OnUpdate(any, any) + OnDelete(any) +} + +type broadcasterHandler struct { + lock sync.Mutex + subscribers []*subscriber +} + +func NewBroadcaster() Broadcaster { + return &broadcasterHandler{} +} + +func (b *broadcasterHandler) notify(event *appv1.ApplicationWatchEvent) { + val, ok := event.Application.Annotations[appv1.AnnotationKeyManifestGeneratePaths] + if !ok || val == "" { + return + } + + // Make a local copy of b.subscribers, then send channel events outside the lock, + // to avoid data race on b.subscribers changes + subscribers := []*subscriber{} + b.lock.Lock() + subscribers = append(subscribers, b.subscribers...) + b.lock.Unlock() + + for _, s := range subscribers { + if s.matches(event) { + select { + case s.ch <- event: + { + // log.Infof("adding application '%s' to channel", event.Application.Name) + } + default: + // drop event if cannot send right away + log.WithField("application", event.Application.Name).Warn("unable to send event notification") + } + } + } +} + +// Subscribe forward application informer watch events to the provided channel. +// The watch events are dropped if no receives are reading events from the channel so the channel must have +// buffer if dropping events is not acceptable. +func (b *broadcasterHandler) Subscribe(ch chan *appv1.ApplicationWatchEvent, filters ...func(event *appv1.ApplicationWatchEvent) bool) func() { + b.lock.Lock() + defer b.lock.Unlock() + subscriber := &subscriber{ch, filters} + b.subscribers = append(b.subscribers, subscriber) + return func() { + b.lock.Lock() + defer b.lock.Unlock() + for i := range b.subscribers { + if b.subscribers[i] == subscriber { + b.subscribers = append(b.subscribers[:i], b.subscribers[i+1:]...) + break + } + } + } +} + +func (b *broadcasterHandler) OnAdd(obj any, _ bool) { + if app, ok := obj.(*appv1.Application); ok { + b.notify(&appv1.ApplicationWatchEvent{Application: *app, Type: watch.Added}) + } +} + +func (b *broadcasterHandler) OnUpdate(_, newObj any) { + if app, ok := newObj.(*appv1.Application); ok { + b.notify(&appv1.ApplicationWatchEvent{Application: *app, Type: watch.Modified}) + } +} + +func (b *broadcasterHandler) OnDelete(obj any) { + if app, ok := obj.(*appv1.Application); ok { + b.notify(&appv1.ApplicationWatchEvent{Application: *app, Type: watch.Deleted}) + } +} diff --git a/acr_controller/controller/controller.go b/acr_controller/controller/controller.go new file mode 100644 index 0000000000000..8215665f39912 --- /dev/null +++ b/acr_controller/controller/controller.go @@ -0,0 +1,81 @@ +package application_change_revision_controller + +import ( + "context" + "time" + + log "github.com/sirupsen/logrus" + "k8s.io/apimachinery/pkg/watch" + "k8s.io/client-go/tools/cache" + + appclient "github.com/argoproj/argo-cd/v3/acr_controller/application" + "github.com/argoproj/argo-cd/v3/acr_controller/service" + appclientset "github.com/argoproj/argo-cd/v3/pkg/client/clientset/versioned" + + appv1 "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" + applisters "github.com/argoproj/argo-cd/v3/pkg/client/listers/application/v1alpha1" + servercache "github.com/argoproj/argo-cd/v3/server/cache" +) + +var watchAPIBufferSize = 1000 + +type ACRController interface { + Run(ctx context.Context) +} + +type applicationChangeRevisionController struct { + appBroadcaster Broadcaster + cache *servercache.Cache + appLister applisters.ApplicationLister + applicationServiceClient appclient.ApplicationClient + acrService service.ACRService + applicationClientset appclientset.Interface +} + +func NewApplicationChangeRevisionController(appInformer cache.SharedIndexInformer, cache *servercache.Cache, applicationServiceClient appclient.ApplicationClient, appLister applisters.ApplicationLister, applicationClientset appclientset.Interface) ACRController { + appBroadcaster := NewBroadcaster() + _, err := appInformer.AddEventHandler(appBroadcaster) + if err != nil { + log.Error(err) + } + return &applicationChangeRevisionController{ + appBroadcaster: appBroadcaster, + cache: cache, + applicationServiceClient: applicationServiceClient, + appLister: appLister, + applicationClientset: applicationClientset, + acrService: service.NewACRService(applicationClientset, applicationServiceClient), + } +} + +func (c *applicationChangeRevisionController) Run(ctx context.Context) { + var logCtx log.FieldLogger = log.StandardLogger() + + calculateIfPermitted := func(ctx context.Context, a appv1.Application, eventType watch.EventType) error { //nolint:golint,unparam + if eventType == watch.Bookmark || eventType == watch.Deleted { + return nil // ignore this event + } + + return c.acrService.ChangeRevision(ctx, &a) + } + + // TODO: move to abstraction + eventsChannel := make(chan *appv1.ApplicationWatchEvent, watchAPIBufferSize) + unsubscribe := c.appBroadcaster.Subscribe(eventsChannel) + defer unsubscribe() + for { + select { + case <-ctx.Done(): + return + case event := <-eventsChannel: + // logCtx.Infof("channel size is %d", len(eventsChannel)) + + ctx, cancel := context.WithTimeout(ctx, 2*time.Minute) + err := calculateIfPermitted(ctx, event.Application, event.Type) + if err != nil { + logCtx.WithError(err).Error("failed to calculate change revision") + } + cancel() + } + } +} diff --git a/acr_controller/server.go b/acr_controller/server.go new file mode 100644 index 0000000000000..eb9f7f0150cfb --- /dev/null +++ b/acr_controller/server.go @@ -0,0 +1,206 @@ +package acr_controller + +import ( + "context" + "crypto/tls" + "fmt" + "net" + "net/http" + "time" + + "github.com/redis/go-redis/v9" + log "github.com/sirupsen/logrus" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/tools/cache" + + appclient "github.com/argoproj/argo-cd/v3/acr_controller/application" + acr_controller "github.com/argoproj/argo-cd/v3/acr_controller/controller" + + appclientset "github.com/argoproj/argo-cd/v3/pkg/client/clientset/versioned" + appinformer "github.com/argoproj/argo-cd/v3/pkg/client/informers/externalversions" + applisters "github.com/argoproj/argo-cd/v3/pkg/client/listers/application/v1alpha1" + servercache "github.com/argoproj/argo-cd/v3/server/cache" + "github.com/argoproj/argo-cd/v3/util/healthz" + settings_util "github.com/argoproj/argo-cd/v3/util/settings" +) + +var backoff = wait.Backoff{ + Steps: 5, + Duration: 500 * time.Millisecond, + Factor: 1.0, + Jitter: 0.1, +} + +type ACRServer struct { + ACRServerOpts + + settings *settings_util.ArgoCDSettings + log *log.Entry + appInformer cache.SharedIndexInformer + appLister applisters.ApplicationLister + applicationClientset appclientset.Interface + + // stopCh is the channel which when closed, will shutdown the Event Reporter server + stopCh chan struct{} + serviceSet *ACRServerSet +} + +type ACRServerSet struct{} + +type ACRServerOpts struct { + ListenPort int + ListenHost string + Namespace string + KubeClientset kubernetes.Interface + AppClientset appclientset.Interface + ApplicationServiceClient appclient.ApplicationClient + Cache *servercache.Cache + RedisClient *redis.Client + ApplicationNamespaces []string + BaseHRef string + RootPath string +} + +type handlerSwitcher struct { + handler http.Handler + urlToHandler map[string]http.Handler + contentTypeToHandler map[string]http.Handler +} + +type Listeners struct { + Main net.Listener +} + +func (l *Listeners) Close() error { + if l.Main != nil { + if err := l.Main.Close(); err != nil { + return err + } + l.Main = nil + } + return nil +} + +func (s *handlerSwitcher) ServeHTTP(w http.ResponseWriter, r *http.Request) { + if urlHandler, ok := s.urlToHandler[r.URL.Path]; ok { + urlHandler.ServeHTTP(w, r) + } else if contentHandler, ok := s.contentTypeToHandler[r.Header.Get("content-type")]; ok { + contentHandler.ServeHTTP(w, r) + } else { + s.handler.ServeHTTP(w, r) + } +} + +func (a *ACRServer) healthCheck(_ *http.Request) error { + return nil +} + +// Init starts informers used by the API server +func (a *ACRServer) Init(ctx context.Context) { + go a.appInformer.Run(ctx.Done()) + svcSet := newApplicationChangeRevisionServiceSet() + a.serviceSet = svcSet +} + +func (a *ACRServer) RunController(ctx context.Context) { + controller := acr_controller.NewApplicationChangeRevisionController(a.appInformer, a.Cache, a.ApplicationServiceClient, a.appLister, a.applicationClientset) + go controller.Run(ctx) +} + +// newHTTPServer returns the HTTP server to serve HTTP/HTTPS requests. This is implemented +// using grpc-gateway as a proxy to the gRPC server. +func (a *ACRServer) newHTTPServer(_ context.Context, port int) *http.Server { //nolint:golint,unparam + endpoint := fmt.Sprintf("localhost:%d", port) + mux := http.NewServeMux() + httpS := http.Server{ + Addr: endpoint, + Handler: &handlerSwitcher{ + handler: mux, + }, + } + + healthz.ServeHealthCheck(mux, a.healthCheck) + return &httpS +} + +func (a *ACRServer) checkServeErr(name string, err error) { + if err != nil { + if a.stopCh != nil { + log.Fatalf("%s: %v", name, err) + } + // a nil stopCh indicates a graceful shutdown + log.Infof("graceful shutdown %s: %v", name, err) + } else { + log.Infof("graceful shutdown %s", name) + } +} + +func startListener(host string, port int) (net.Listener, error) { + var conn net.Listener + var realErr error + _ = wait.ExponentialBackoff(backoff, func() (bool, error) { + conn, realErr = net.Listen("tcp", fmt.Sprintf("%s:%d", host, port)) + if realErr != nil { + return false, nil + } + return true, nil + }) + return conn, realErr +} + +func (a *ACRServer) Listen() (*Listeners, error) { + mainLn, err := startListener(a.ListenHost, a.ListenPort) + if err != nil { + return nil, err + } + return &Listeners{Main: mainLn}, nil +} + +// Run runs the API Server +// We use k8s.io/code-generator/cmd/go-to-protobuf to generate the .proto files from the API types. +// k8s.io/ go-to-protobuf uses protoc-gen-gogo, which comes from gogo/protobuf (a fork of +// golang/protobuf). +func (a *ACRServer) Run(ctx context.Context, lns *Listeners) { + httpS := a.newHTTPServer(ctx, a.ListenPort) + tlsConfig := tls.Config{} + tlsConfig.GetCertificate = func(_ *tls.ClientHelloInfo) (*tls.Certificate, error) { + return a.settings.Certificate, nil + } + go func() { a.checkServeErr("httpS", httpS.Serve(lns.Main)) }() + go a.RunController(ctx) + + if !cache.WaitForCacheSync(ctx.Done(), a.appInformer.HasSynced) { + log.Fatal("Timed out waiting for project cache to sync") + } + + a.stopCh = make(chan struct{}) + <-a.stopCh +} + +// NewServer returns a new instance of the Event Reporter server +func NewApplicationChangeRevisionServer(_ context.Context, opts ACRServerOpts) *ACRServer { + appInformerNs := opts.Namespace + if len(opts.ApplicationNamespaces) > 0 { + appInformerNs = "" + } + appFactory := appinformer.NewSharedInformerFactoryWithOptions(opts.AppClientset, 0, appinformer.WithNamespace(appInformerNs), appinformer.WithTweakListOptions(func(_ *metav1.ListOptions) {})) + + appInformer := appFactory.Argoproj().V1alpha1().Applications().Informer() + appLister := appFactory.Argoproj().V1alpha1().Applications().Lister() + + server := &ACRServer{ + ACRServerOpts: opts, + log: log.NewEntry(log.StandardLogger()), + appInformer: appInformer, + appLister: appLister, + applicationClientset: opts.AppClientset, + } + + return server +} + +func newApplicationChangeRevisionServiceSet() *ACRServerSet { + return &ACRServerSet{} +} diff --git a/acr_controller/service/acr_service.go b/acr_controller/service/acr_service.go new file mode 100644 index 0000000000000..bd4c7b60997f1 --- /dev/null +++ b/acr_controller/service/acr_service.go @@ -0,0 +1,202 @@ +package service + +import ( + "context" + "encoding/json" + "sync" + + log "github.com/sirupsen/logrus" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/utils/ptr" + + argoclient "github.com/argoproj/argo-cd/v3/acr_controller/application" + appclient "github.com/argoproj/argo-cd/v3/pkg/apiclient/application" + application "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" + appclientset "github.com/argoproj/argo-cd/v3/pkg/client/clientset/versioned" +) + +type ACRService interface { + ChangeRevision(ctx context.Context, application *application.Application) error +} + +type acrService struct { + applicationClientset appclientset.Interface + applicationServiceClient argoclient.ApplicationClient + lock sync.Mutex + logger *log.Logger +} + +func NewACRService(applicationClientset appclientset.Interface, applicationServiceClient argoclient.ApplicationClient) ACRService { + return &acrService{ + applicationClientset: applicationClientset, + applicationServiceClient: applicationServiceClient, + logger: log.New(), + } +} + +func getChangeRevisionFromRevisions(revisions []string) string { + if len(revisions) > 0 { + return revisions[0] + } + return "" +} + +func getChangeRevision(app *application.Application) string { + if app.Status.OperationState != nil && app.Status.OperationState.Operation.Sync != nil { + changeRevision := app.Status.OperationState.Operation.Sync.ChangeRevision + if changeRevision != "" { + return changeRevision + } + if changeRevision = getChangeRevisionFromRevisions(app.Status.OperationState.Operation.Sync.ChangeRevisions); changeRevision != "" { + return changeRevision + } + } + return "" +} + +func (c *acrService) ChangeRevision(ctx context.Context, a *application.Application) error { + c.lock.Lock() + defer c.lock.Unlock() + + app, err := c.applicationClientset.ArgoprojV1alpha1().Applications(a.Namespace).Get(ctx, a.Name, metav1.GetOptions{}) + if err != nil { + return err + } + + if app.Operation == nil || app.Operation.Sync == nil { + return nil + } + + if getChangeRevision(app) != "" { + c.logger.Infof("Change revision already calculated for application %s", app.Name) + return nil + } + + revision, err := c.calculateRevision(ctx, app) + if err != nil { + return err + } + + if revision == nil || *revision == "" { + c.logger.Infof("Revision for application %s is empty", app.Name) + return nil + } + + c.logger.Infof("Change revision for application %s is %s", app.Name, *revision) + + app, err = c.applicationClientset.ArgoprojV1alpha1().Applications(app.Namespace).Get(ctx, app.Name, metav1.GetOptions{}) + if err != nil { + return err + } + + revisions := []string{*revision} + + if app.Status.OperationState != nil && app.Status.OperationState.Operation.Sync != nil { + c.logger.Infof("Patch operation status for application %s", app.Name) + return c.patchOperationSyncResultWithChangeRevision(ctx, app, revisions) + } + + c.logger.Infof("Patch operation for application %s", app.Name) + return c.patchOperationWithChangeRevision(ctx, app, revisions) +} + +func (c *acrService) calculateRevision(ctx context.Context, a *application.Application) (*string, error) { + currentRevision, previousRevision := c.getRevisions(ctx, a) + c.logger.Infof("Calculate revision for application '%s', current revision '%s', previous revision '%s'", a.Name, currentRevision, previousRevision) + changeRevisionResult, err := c.applicationServiceClient.GetChangeRevision(ctx, &appclient.ChangeRevisionRequest{ + AppName: ptr.To(a.GetName()), + Namespace: ptr.To(a.GetNamespace()), + CurrentRevision: ptr.To(currentRevision), + PreviousRevision: ptr.To(previousRevision), + }) + if err != nil { + return nil, err + } + return changeRevisionResult.Revision, nil +} + +func (c *acrService) patchOperationWithChangeRevision(ctx context.Context, a *application.Application, revisions []string) error { + if len(revisions) == 1 { + patch, _ := json.Marshal(map[string]any{ + "operation": map[string]any{ + "sync": map[string]any{ + "changeRevision": revisions[0], + }, + }, + }) + _, err := c.applicationClientset.ArgoprojV1alpha1().Applications(a.Namespace).Patch(ctx, a.Name, types.MergePatchType, patch, metav1.PatchOptions{}) + return err + } + + patch, _ := json.Marshal(map[string]any{ + "operation": map[string]any{ + "sync": map[string]any{ + "changeRevisions": revisions, + }, + }, + }) + _, err := c.applicationClientset.ArgoprojV1alpha1().Applications(a.Namespace).Patch(ctx, a.Name, types.MergePatchType, patch, metav1.PatchOptions{}) + return err +} + +func (c *acrService) patchOperationSyncResultWithChangeRevision(ctx context.Context, a *application.Application, revisions []string) error { + if len(revisions) == 1 { + patch, _ := json.Marshal(map[string]any{ + "status": map[string]any{ + "operationState": map[string]any{ + "operation": map[string]any{ + "sync": map[string]any{ + "changeRevision": revisions[0], + }, + }, + }, + }, + }) + _, err := c.applicationClientset.ArgoprojV1alpha1().Applications(a.Namespace).Patch(ctx, a.Name, types.MergePatchType, patch, metav1.PatchOptions{}) + return err + } + + patch, _ := json.Marshal(map[string]any{ + "status": map[string]any{ + "operationState": map[string]any{ + "operation": map[string]any{ + "sync": map[string]any{ + "changeRevisions": revisions, + }, + }, + }, + }, + }) + _, err := c.applicationClientset.ArgoprojV1alpha1().Applications(a.Namespace).Patch(ctx, a.Name, types.MergePatchType, patch, metav1.PatchOptions{}) + return err +} + +func getCurrentRevisionFromOperation(a *application.Application) string { + if a.Operation != nil && a.Operation.Sync != nil { + return a.Operation.Sync.Revision + } + return "" +} + +func (c *acrService) getRevisions(_ context.Context, a *application.Application) (string, string) { + if len(a.Status.History) == 0 { + // it is first sync operation, and we have only current revision + return getCurrentRevisionFromOperation(a), "" + } + + // in case if sync is already done, we need to use revision from sync result and previous revision from history + if a.Status.Sync.Status == "Synced" && a.Status.OperationState != nil && a.Status.OperationState.SyncResult != nil { + currentRevision := a.Status.OperationState.SyncResult.Revision + // in case if we have only one history record, we need to return empty previous revision, because it is first sync result + if len(a.Status.History) == 1 { + return currentRevision, "" + } + return currentRevision, a.Status.History[len(a.Status.History)-2].Revision + } + + // in case if sync is in progress, we need to use revision from operation and revision from latest history record + currentRevision := getCurrentRevisionFromOperation(a) + previousRevision := a.Status.History[len(a.Status.History)-1].Revision + return currentRevision, previousRevision +} diff --git a/acr_controller/service/acr_service_test.go b/acr_controller/service/acr_service_test.go new file mode 100644 index 0000000000000..4ca8dbc60ff2f --- /dev/null +++ b/acr_controller/service/acr_service_test.go @@ -0,0 +1,318 @@ +package service + +import ( + "testing" + + "github.com/sirupsen/logrus" + test2 "github.com/sirupsen/logrus/hooks/test" + + "github.com/argoproj/argo-cd/v3/acr_controller/application/mocks" + appclient "github.com/argoproj/argo-cd/v3/pkg/apiclient/application" + appsv1 "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" + apps "github.com/argoproj/argo-cd/v3/pkg/client/clientset/versioned/fake" + "github.com/argoproj/argo-cd/v3/test" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/utils/ptr" + "sigs.k8s.io/yaml" +) + +const fakeApp = ` +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: test-app + namespace: default +spec: + source: + path: some/path + repoURL: https://github.com/argoproj/argocd-example-apps.git + targetRevision: HEAD + ksonnet: + environment: default + destination: + namespace: ` + test.FakeDestNamespace + ` + server: https://cluster-api.example.com +` + +const fakeAppWithOperation = ` +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + annotations: + argocd.argoproj.io/manifest-generate-paths: . + finalizers: + - resources-finalizer.argocd.argoproj.io + labels: + app.kubernetes.io/instance: guestbook + name: guestbook + namespace: codefresh +operation: + initiatedBy: + automated: true + retry: + limit: 5 + sync: + prune: true + revision: c732f4d2ef24c7eeb900e9211ff98f90bb646505 + syncOptions: + - CreateNamespace=true +spec: + destination: + namespace: guestbook + server: https://kubernetes.default.svc + project: default + source: + path: apps/guestbook + repoURL: https://github.com/pasha-codefresh/precisely-gitsource.git + targetRevision: HEAD +` + +const syncedAppWithSingleHistory = ` +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + annotations: + argocd.argoproj.io/manifest-generate-paths: . + finalizers: + - resources-finalizer.argocd.argoproj.io + labels: + app.kubernetes.io/instance: guestbook + name: guestbook + namespace: codefresh +operation: + initiatedBy: + automated: true + retry: + limit: 5 + sync: + prune: true + revision: c732f4d2ef24c7eeb900e9211ff98f90bb646505 + syncOptions: + - CreateNamespace=true +spec: + destination: + namespace: guestbook + server: https://kubernetes.default.svc + project: default + source: + path: apps/guestbook + repoURL: https://github.com/pasha-codefresh/precisely-gitsource.git + targetRevision: HEAD +status: + history: + - deployStartedAt: "2024-06-20T19:35:36Z" + deployedAt: "2024-06-20T19:35:44Z" + id: 3 + initiatedBy: {} + revision: 792822850fd2f6db63597533e16dfa27e6757dc5 + source: + path: apps/guestbook + repoURL: https://github.com/pasha-codefresh/precisely-gitsource.git + targetRevision: HEAD + operationState: + operation: + sync: + prune: true + revision: c732f4d2ef24c7eeb900e9211ff98f90bb646506 + syncOptions: + - CreateNamespace=true + phase: Running + startedAt: "2024-06-20T19:47:34Z" + syncResult: + revision: c732f4d2ef24c7eeb900e9211ff98f90bb646505 + source: + path: apps/guestbook + repoURL: https://github.com/pasha-codefresh/precisely-gitsource.git + targetRevision: HEAD + sync: + revision: 00d423763fbf56d2ea452de7b26a0ab20590f521 + status: Synced +` + +const syncedAppWithHistory = ` +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + annotations: + argocd.argoproj.io/manifest-generate-paths: . + finalizers: + - resources-finalizer.argocd.argoproj.io + labels: + app.kubernetes.io/instance: guestbook + name: guestbook + namespace: codefresh +operation: + initiatedBy: + automated: true + retry: + limit: 5 + sync: + prune: true + revision: c732f4d2ef24c7eeb900e9211ff98f90bb646505 + syncOptions: + - CreateNamespace=true +spec: + destination: + namespace: guestbook + server: https://kubernetes.default.svc + project: default + source: + path: apps/guestbook + repoURL: https://github.com/pasha-codefresh/precisely-gitsource.git + targetRevision: HEAD +status: + history: + - deployStartedAt: "2024-06-20T19:35:36Z" + deployedAt: "2024-06-20T19:35:44Z" + id: 3 + initiatedBy: {} + revision: 792822850fd2f6db63597533e16dfa27e6757dc5 + source: + path: apps/guestbook + repoURL: https://github.com/pasha-codefresh/precisely-gitsource.git + targetRevision: HEAD + - deployStartedAt: "2024-06-20T19:36:34Z" + deployedAt: "2024-06-20T19:36:42Z" + id: 4 + initiatedBy: {} + revision: ee5373eb9814e247ec6944e8b8897a8ec2f8528e + source: + path: apps/guestbook + repoURL: https://github.com/pasha-codefresh/precisely-gitsource.git + targetRevision: HEAD + operationState: + operation: + sync: + prune: true + revision: c732f4d2ef24c7eeb900e9211ff98f90bb646506 + syncOptions: + - CreateNamespace=true + phase: Running + startedAt: "2024-06-20T19:47:34Z" + syncResult: + revision: c732f4d2ef24c7eeb900e9211ff98f90bb646505 + source: + path: apps/guestbook + repoURL: https://github.com/pasha-codefresh/precisely-gitsource.git + targetRevision: HEAD + sync: + revision: 00d423763fbf56d2ea452de7b26a0ab20590f521 + status: Synced +` + +func newTestACRService(client *mocks.ApplicationClient) *acrService { + fakeAppsClientset := apps.NewSimpleClientset(createTestApp(syncedAppWithHistory)) + return &acrService{ + applicationClientset: fakeAppsClientset, + applicationServiceClient: client, + logger: logrus.New(), + } +} + +func createTestApp(testApp string, opts ...func(app *appsv1.Application)) *appsv1.Application { + var app appsv1.Application + err := yaml.Unmarshal([]byte(testApp), &app) + if err != nil { + panic(err) + } + for i := range opts { + opts[i](&app) + } + return &app +} + +func Test_getRevisions(r *testing.T) { + r.Run("history list is empty", func(t *testing.T) { + acrService := newTestACRService(&mocks.ApplicationClient{}) + current, previous := acrService.getRevisions(r.Context(), createTestApp(fakeApp)) + assert.Equal(t, "", current) + assert.Equal(t, "", previous) + }) + + r.Run("history list is empty, but operation happens right now", func(t *testing.T) { + acrService := newTestACRService(&mocks.ApplicationClient{}) + current, previous := acrService.getRevisions(r.Context(), createTestApp(fakeAppWithOperation)) + assert.Equal(t, "c732f4d2ef24c7eeb900e9211ff98f90bb646505", current) + assert.Equal(t, "", previous) + }) + + r.Run("history list contains only one element, also sync result is here", func(t *testing.T) { + acrService := newTestACRService(&mocks.ApplicationClient{}) + current, previous := acrService.getRevisions(r.Context(), createTestApp(syncedAppWithSingleHistory)) + assert.Equal(t, "c732f4d2ef24c7eeb900e9211ff98f90bb646505", current) + assert.Equal(t, "", previous) + }) + + r.Run("application is synced", func(t *testing.T) { + acrService := newTestACRService(&mocks.ApplicationClient{}) + app := createTestApp(syncedAppWithHistory) + current, previous := acrService.getRevisions(r.Context(), app) + assert.Equal(t, app.Status.OperationState.SyncResult.Revision, current) + assert.Equal(t, app.Status.History[len(app.Status.History)-2].Revision, previous) + }) + + r.Run("application sync is in progress", func(t *testing.T) { + acrService := newTestACRService(&mocks.ApplicationClient{}) + app := createTestApp(syncedAppWithHistory) + app.Status.Sync.Status = "Syncing" + current, previous := acrService.getRevisions(r.Context(), app) + assert.Equal(t, app.Operation.Sync.Revision, current) + assert.Equal(t, app.Status.History[len(app.Status.History)-1].Revision, previous) + }) +} + +func Test_ChangeRevision(r *testing.T) { + r.Run("Change revision", func(t *testing.T) { + client := &mocks.ApplicationClient{} + client.On("GetChangeRevision", mock.Anything, mock.Anything).Return(&appclient.ChangeRevisionResponse{ + Revision: ptr.To("new-revision"), + }, nil) + acrService := newTestACRService(client) + app := createTestApp(syncedAppWithHistory) + + err := acrService.ChangeRevision(r.Context(), app) + require.NoError(t, err) + + app, err = acrService.applicationClientset.ArgoprojV1alpha1().Applications(app.Namespace).Get(r.Context(), app.Name, metav1.GetOptions{}) + require.NoError(t, err) + + assert.Equal(t, "new-revision", app.Status.OperationState.Operation.Sync.ChangeRevision) + }) + + r.Run("Change revision already exists", func(t *testing.T) { + client := &mocks.ApplicationClient{} + client.On("GetChangeRevision", mock.Anything, mock.Anything).Return(&appclient.ChangeRevisionResponse{ + Revision: ptr.To("new-revision"), + }, nil) + + logger, logHook := test2.NewNullLogger() + + acrService := newTestACRService(client) + acrService.logger = logger + + app := createTestApp(syncedAppWithHistory) + + err := acrService.ChangeRevision(r.Context(), app) + require.NoError(t, err) + + app, err = acrService.applicationClientset.ArgoprojV1alpha1().Applications(app.Namespace).Get(r.Context(), app.Name, metav1.GetOptions{}) + require.NoError(t, err) + + assert.Equal(t, "new-revision", app.Status.OperationState.Operation.Sync.ChangeRevision) + + err = acrService.ChangeRevision(r.Context(), app) + + require.NoError(t, err) + + lastLogEntry := logHook.LastEntry() + if lastLogEntry == nil { + t.Fatal("No log entry") + } + + require.Equal(t, "Change revision already calculated for application guestbook", lastLogEntry.Message) + }) +} diff --git a/argocd-cosign.pub b/argocd-cosign.pub new file mode 100644 index 0000000000000..bd14342b9c1b4 --- /dev/null +++ b/argocd-cosign.pub @@ -0,0 +1,4 @@ +-----BEGIN PUBLIC KEY----- +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEesHEB7vX5Y2RxXypjMy1nI1z7iRG +JI9/gt/sYqzpsa65aaNP4npM43DDxoIy/MQBo9s/mxGxmA+8UXeDpVC9vw== +-----END PUBLIC KEY----- diff --git a/assets/swagger.json b/assets/swagger.json index 3dae5a2f0f712..39ce85cab94d2 100644 --- a/assets/swagger.json +++ b/assets/swagger.json @@ -8641,6 +8641,9 @@ "buildOptions": { "type": "string", "title": "BuildOptions is a string of build parameters to use when calling `kustomize build`" + }, + "setNamespace": { + "type": "boolean" } } }, diff --git a/cmd/application-change-revision-controller/commands/application_change_revision_controller.go b/cmd/application-change-revision-controller/commands/application_change_revision_controller.go new file mode 100644 index 0000000000000..df084a9a2fc35 --- /dev/null +++ b/cmd/application-change-revision-controller/commands/application_change_revision_controller.go @@ -0,0 +1,158 @@ +package commands + +import ( + "context" + "fmt" + "time" + + acr "github.com/argoproj/argo-cd/v3/acr_controller" + cacheutil "github.com/argoproj/argo-cd/v3/util/cache" + + "github.com/argoproj/pkg/stats" + "github.com/redis/go-redis/v9" + log "github.com/sirupsen/logrus" + "github.com/spf13/cobra" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/tools/clientcmd" + + appclient "github.com/argoproj/argo-cd/v3/acr_controller/application" + + cmdutil "github.com/argoproj/argo-cd/v3/cmd/util" + "github.com/argoproj/argo-cd/v3/common" + "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" + appclientset "github.com/argoproj/argo-cd/v3/pkg/client/clientset/versioned" + servercache "github.com/argoproj/argo-cd/v3/server/cache" + "github.com/argoproj/argo-cd/v3/util/cli" + "github.com/argoproj/argo-cd/v3/util/env" + "github.com/argoproj/argo-cd/v3/util/errors" + "github.com/argoproj/argo-cd/v3/util/kube" +) + +const ( + failureRetryCountEnv = "EVENT_REPORTER_K8S_RETRY_COUNT" + failureRetryPeriodMilliSecondsEnv = "EVENT_REPORTE_K8S_RETRY_DURATION_MILLISECONDS" +) + +var ( + failureRetryCount = 0 + failureRetryPeriodMilliSeconds = 100 +) + +func init() { + failureRetryCount = env.ParseNumFromEnv(failureRetryCountEnv, failureRetryCount, 0, 10) + failureRetryPeriodMilliSeconds = env.ParseNumFromEnv(failureRetryPeriodMilliSecondsEnv, failureRetryPeriodMilliSeconds, 0, 1000) +} + +func getApplicationClient(address, token string, path string) appclient.ApplicationClient { + return appclient.NewHTTPApplicationClient(token, address, path) +} + +// NewCommand returns a new instance of an application change revision command +func NewCommand() *cobra.Command { + var ( + redisClient *redis.Client + listenHost string + listenPort int + glogLevel int + clientConfig clientcmd.ClientConfig + applicationServerAddress string + cacheSrc func() (*servercache.Cache, error) + contentSecurityPolicy string + applicationNamespaces []string + argocdToken string + rootpath string + ) + command := &cobra.Command{ + Use: cliName, + Short: "Run the Change Revision Controller server", + Long: "The Change Revision Controller is a service that listens for application events and updates the application's revision in the application CRD", + DisableAutoGenTag: true, + Run: func(c *cobra.Command, _ []string) { + ctx := c.Context() + + vers := common.GetVersion() + namespace, _, err := clientConfig.Namespace() + errors.CheckError(err) + vers.LogStartupInfo( + "Application Change Revision Controller", + map[string]any{ + "namespace": namespace, + "port": listenPort, + }, + ) + + cli.SetLogFormat(cmdutil.LogFormat) + cli.SetLogLevel(cmdutil.LogLevel) + cli.SetGLogLevel(glogLevel) + + config, err := clientConfig.ClientConfig() + errors.CheckError(err) + errors.CheckError(v1alpha1.SetK8SConfigDefaults(config)) + + cache, err := cacheSrc() + errors.CheckError(err) + + kubeclientset := kubernetes.NewForConfigOrDie(config) + + appclientsetConfig, err := clientConfig.ClientConfig() + errors.CheckError(err) + errors.CheckError(v1alpha1.SetK8SConfigDefaults(appclientsetConfig)) + config.UserAgent = fmt.Sprintf("argocd-server/%s (%s)", vers.Version, vers.Platform) + + if failureRetryCount > 0 { + appclientsetConfig = kube.AddFailureRetryWrapper(appclientsetConfig, failureRetryCount, failureRetryPeriodMilliSeconds) + } + appClientSet := appclientset.NewForConfigOrDie(appclientsetConfig) + + changeRevisionServerOpts := acr.ACRServerOpts{ + ListenPort: listenPort, + ListenHost: listenHost, + Namespace: namespace, + KubeClientset: kubeclientset, + AppClientset: appClientSet, + Cache: cache, + RedisClient: redisClient, + ApplicationNamespaces: applicationNamespaces, + ApplicationServiceClient: getApplicationClient(applicationServerAddress, argocdToken, rootpath), + } + + log.Info("Starting change revision controller server") + + stats.RegisterStackDumper() + stats.StartStatsTicker(10 * time.Minute) + stats.RegisterHeapDumper("memprofile") + changeRevisionServer := acr.NewApplicationChangeRevisionServer(ctx, changeRevisionServerOpts) + changeRevisionServer.Init(ctx) + lns, err := changeRevisionServer.Listen() + errors.CheckError(err) + for { + var closer func() + ctx, cancel := context.WithCancel(ctx) + changeRevisionServer.Run(ctx, lns) + cancel() + if closer != nil { + closer() + } + } + }, + } + + clientConfig = cli.AddKubectlFlagsToCmd(command) + command.Flags().StringVar(&rootpath, "argocd-server-path", env.StringFromEnv("ARGOCD_SERVER_ROOTPATH", ""), "Used if Argo CD is running behind reverse proxy under subpath different from /") + command.Flags().StringVar(&cmdutil.LogFormat, "logformat", env.StringFromEnv("ACR_CONTROLLER_LOGFORMAT", "text"), "Set the logging format. One of: text|json") + command.Flags().StringVar(&cmdutil.LogLevel, "loglevel", env.StringFromEnv("ACR_CONTROLLER_LOG_LEVEL", "info"), "Set the logging level. One of: debug|info|warn|error") + command.Flags().IntVar(&glogLevel, "gloglevel", 0, "Set the glog logging level") + command.Flags().StringVar(&applicationServerAddress, "application-server", env.StringFromEnv("ARGOCD_SERVER", common.DefaultApplicationServerAddr), "Application server address") + command.Flags().StringVar(&argocdToken, "argocd-token", env.StringFromEnv("ARGOCD_TOKEN", ""), "ArgoCD server JWT token") + command.AddCommand(cli.NewVersionCmd(cliName)) + command.Flags().StringVar(&listenHost, "address", env.StringFromEnv("ACR_CONTROLLER_LISTEN_ADDRESS", common.DefaultAddressACRController), "Listen on given address") + command.Flags().IntVar(&listenPort, "port", common.DefaultPortACRServer, "Listen on given port") + command.Flags().StringVar(&contentSecurityPolicy, "content-security-policy", env.StringFromEnv("ACR_CONTROLLER_CONTENT_SECURITY_POLICY", "frame-ancestors 'self';"), "Set Content-Security-Policy header in HTTP responses to `value`. To disable, set to \"\".") + command.Flags().StringSliceVar(&applicationNamespaces, "application-namespaces", env.StringsFromEnv("ARGOCD_APPLICATION_NAMESPACES", []string{}, ","), "List of additional namespaces where application resources can be managed in") + cacheSrc = servercache.AddCacheFlagsToCmd(command, cacheutil.Options{ + OnClientCreated: func(client *redis.Client) { + redisClient = client + }, + }) + return command +} diff --git a/cmd/application-change-revision-controller/commands/common.go b/cmd/application-change-revision-controller/commands/common.go new file mode 100644 index 0000000000000..c1ca08e656615 --- /dev/null +++ b/cmd/application-change-revision-controller/commands/common.go @@ -0,0 +1,6 @@ +package commands + +const ( + // cliName is the name of the CLI + cliName = "application-change-revision-controller" +) diff --git a/cmd/argocd/commands/app_test.go b/cmd/argocd/commands/app_test.go index 459e2a6cdaab0..e845b8d58b8f1 100644 --- a/cmd/argocd/commands/app_test.go +++ b/cmd/argocd/commands/app_test.go @@ -2237,6 +2237,18 @@ func (c *fakeAppServiceClient) RunResourceActionV2(_ context.Context, _ *applica return nil, nil } +func (c *fakeAppServiceClient) RollbackApplicationRollout(_ context.Context, _ *applicationpkg.ApplicationRolloutRollbackRequest, _ ...grpc.CallOption) (*applicationpkg.ApplicationRolloutRollbackResponse, error) { + return nil, nil +} + +func (c *fakeAppServiceClient) ValidateSrcAndDst(_ context.Context, _ *applicationpkg.ApplicationValidationRequest, _ ...grpc.CallOption) (*applicationpkg.ApplicationValidateResponse, error) { + return nil, nil +} + +func (c *fakeAppServiceClient) GetChangeRevision(_ context.Context, _ *applicationpkg.ChangeRevisionRequest, _ ...grpc.CallOption) (*applicationpkg.ChangeRevisionResponse, error) { + return nil, nil +} + func (c *fakeAppServiceClient) DeleteResource(_ context.Context, _ *applicationpkg.ApplicationResourceDeleteRequest, _ ...grpc.CallOption) (*applicationpkg.ApplicationResponse, error) { return nil, nil } diff --git a/cmd/main.go b/cmd/main.go index fb3efd9547be2..ebe441a46de2e 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -9,6 +9,7 @@ import ( "github.com/spf13/cobra" "k8s.io/klog/v2" + changerevisioncontroller "github.com/argoproj/argo-cd/v3/cmd/application-change-revision-controller/commands" appcontroller "github.com/argoproj/argo-cd/v3/cmd/argocd-application-controller/commands" applicationset "github.com/argoproj/argo-cd/v3/cmd/argocd-applicationset-controller/commands" cmpserver "github.com/argoproj/argo-cd/v3/cmd/argocd-cmp-server/commands" @@ -49,6 +50,8 @@ func main() { isArgocdCLI = true case "argocd-server": command = apiserver.NewCommand() + case "argocd-application-change-revision-controller": + command = changerevisioncontroller.NewCommand() case "argocd-application-controller": command = appcontroller.NewCommand() case "argocd-repo-server": diff --git a/common/cf_common.go b/common/cf_common.go new file mode 100644 index 0000000000000..2a5a6c260bd2f --- /dev/null +++ b/common/cf_common.go @@ -0,0 +1,44 @@ +package common + +// Default service addresses and URLS of Argo CD internal services +const ( + // DefaultApplicationServerAddr is the HTTP address of the Argo CD server + DefaultApplicationServerAddr = "argo-cd-server:80" + // DefaultRedisHaProxyAddr is the default HTTP address of the sources server + DefaultSourcesServerAddr = "sources-server:8090" +) + +// Default listener ports for ArgoCD components +const ( + DefaultPortEventReporterServerMetrics = 8087 + DefaultPortEventReporterServer = 8088 + + DefaultPortACRServer = 8090 +) + +// DefaultAddressAPIServer for ArgoCD components +const ( + DefaultAddressEventReporterServer = "0.0.0.0" + DefaultAddressACRController = "0.0.0.0" + DefaultAddressEventReporterServerMetrics = "0.0.0.0" +) + +// Environment variables for tuning and debugging Argo CD +const ( + // EnvApplicationEventCacheDuration controls the expiration of application events cache + EnvApplicationEventCacheDuration = "ARGOCD_APP_EVENTS_CACHE_DURATION" + // EnvResourceEventCacheDuration controls the expiration of resource events cache + EnvResourceEventCacheDuration = "ARGOCD_RESOURCE_EVENTS_CACHE_DURATION" + // EnvEventReporterShardingAlgorithm is the distribution sharding algorithm to be used: legacy + EnvEventReporterShardingAlgorithm = "EVENT_REPORTER_SHARDING_ALGORITHM" + // EnvEventReporterReplicas is the number of EventReporter replicas + EnvEventReporterReplicas = "EVENT_REPORTER_REPLICAS" + // EnvEventReporterShard is the shard number that should be handled by reporter + EnvEventReporterShard = "EVENT_REPORTER_SHARD" +) + +// CF Event reporter constants +const ( + EventReporterLegacyShardingAlgorithm = "legacy" + DefaultEventReporterShardingAlgorithm = EventReporterLegacyShardingAlgorithm +) diff --git a/controller/state.go b/controller/state.go index a24856eeb498d..61b780de44d5e 100644 --- a/controller/state.go +++ b/controller/state.go @@ -238,7 +238,7 @@ func (m *appStateManager) GetRepoObjs(app *v1alpha1.Application, sources []v1alp if err != nil { return nil, nil, false, fmt.Errorf("failed to get repo %q: %w", source.RepoURL, err) } - kustomizeOptions, err := kustomizeSettings.GetOptions(source) + kustomizeOptions, err := kustomizeSettings.GetOptions(source, m.settingsMgr.GetKustomizeSetNamespaceEnabled()) if err != nil { return nil, nil, false, fmt.Errorf("failed to get Kustomize options for source %d of %d: %w", i+1, len(sources), err) } diff --git a/controller/sync.go b/controller/sync.go index d9eac85bef311..202dbc64c5077 100644 --- a/controller/sync.go +++ b/controller/sync.go @@ -101,6 +101,8 @@ func (m *appStateManager) SyncAppState(app *v1alpha1.Application, state *v1alpha var sources []v1alpha1.ApplicationSource revisions := make([]string, 0) + logCtx := log.WithField("application", app.Name) + if state.Operation.Sync == nil { state.Phase = common.OperationFailed state.Message = "Invalid operation request: no operation specified" @@ -135,6 +137,7 @@ func (m *appStateManager) SyncAppState(app *v1alpha1.Application, state *v1alpha syncRes = state.SyncResult revision = state.SyncResult.Revision revisions = append(revisions, state.SyncResult.Revisions...) + logCtx.Infof("Resuming sync operation to revision %s", revision) } else { syncRes = &v1alpha1.SyncOperationResult{} // status.operationState.syncResult.source. must be set properly since auto-sync relies @@ -157,6 +160,7 @@ func (m *appStateManager) SyncAppState(app *v1alpha1.Application, state *v1alpha } } else { if revision == "" { + logCtx.Infof("No previous sync state found, revision is empty. Take revision from operation \"%s\"", syncOp.Revision) revision = syncOp.Revision } } @@ -412,6 +416,7 @@ func (m *appStateManager) SyncAppState(app *v1alpha1.Application, state *v1alpha if state.Phase == common.OperationTerminating { syncCtx.Terminate() } else { + logEntry.Infof("Starting sync operation for revision \"%s\"", compareResult.syncStatus.Revision) syncCtx.Sync() } var resState []common.ResourceSyncResult diff --git a/docs/proposals/manifest-hydrator.md b/docs/proposals/manifest-hydrator.md index 313c92adb78de..2cac775fb5636 100644 --- a/docs/proposals/manifest-hydrator.md +++ b/docs/proposals/manifest-hydrator.md @@ -164,7 +164,7 @@ Argo CD will then group those sources by the configured `syncSource` targetBranc ```go package hydrator -import "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" +import "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" type DrySource struct { repoURL string diff --git a/hack/goreman-start.sh b/hack/goreman-start.sh index b5886084c7dff..e753150e31ad3 100644 --- a/hack/goreman-start.sh +++ b/hack/goreman-start.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -declare -a services=("controller" "api-server" "redis" "repo-server" "ui") +declare -a services=("controller" "api-server" "redis" "repo-server" "ui" "applicationset-controller") EXCLUDE=$exclude diff --git a/hack/update-manifests.sh b/hack/update-manifests.sh index 44cff36120eec..f787ea47c50b4 100755 --- a/hack/update-manifests.sh +++ b/hack/update-manifests.sh @@ -12,16 +12,17 @@ KUSTOMIZE=kustomize cd ${SRCROOT}/manifests/ha/base/redis-ha && ./generate.sh -IMAGE_NAMESPACE="${IMAGE_NAMESPACE:-quay.io/argoproj}" +IMAGE_NAMESPACE="${IMAGE_NAMESPACE:-quay.io/codefresh}" IMAGE_TAG="${IMAGE_TAG:-}" # if the tag has not been declared, and we are on a release branch, use the VERSION file. +# CODEFRESH: we always want to generate the manifests with the version from the VERSION file, so we will always set IMAGE_TAG to the version in the VERSION file. if [ "$IMAGE_TAG" = "" ]; then - branch=$(git rev-parse --abbrev-ref HEAD) - if [[ $branch = release-* ]]; then + # branch=$(git rev-parse --abbrev-ref HEAD) + # if [[ $branch = sync-* ]]; then pwd IMAGE_TAG=v$(cat $SRCROOT/VERSION) - fi + # fi fi # otherwise, use latest if [ "$IMAGE_TAG" = "" ]; then diff --git a/manifests/base/acr-controller/acr-controller-deployment.yaml b/manifests/base/acr-controller/acr-controller-deployment.yaml new file mode 100644 index 0000000000000..d75ab9f05b55f --- /dev/null +++ b/manifests/base/acr-controller/acr-controller-deployment.yaml @@ -0,0 +1,88 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app.kubernetes.io/name: acr-controller + app.kubernetes.io/part-of: argocd + app.kubernetes.io/component: acr-controller + name: acr-controller +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: acr-controller + template: + metadata: + labels: + app.kubernetes.io/name: acr-controller + spec: + serviceAccountName: acr-controller + containers: + - name: acr-controller + image: quay.io/argoproj/argocd:latest + imagePullPolicy: Always + args: + - /usr/local/bin/argocd-application-change-revision-controller + env: + - name: ARGOCD_SERVER + value: "http://argocd-server:80" + - name: ARGOCD_TOKEN + valueFrom: + secretKeyRef: + key: token + name: argocd-token + - name: ARGOCD_SERVER_ROOTPATH + valueFrom: + configMapKeyRef: + key: server.rootpath + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATION_NAMESPACES + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: application.namespaces + optional: true + - name: ACR_CONTROLLER_LOGFORMAT + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: acr.log.format + optional: true + - name: ACR_CONTROLLER_LOG_LEVEL + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: acr.log.level + optional: true + - name: ACR_CONTROLLER_LISTEN_ADDRESS + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: acr.listen.address + optional: true + ports: + - containerPort: 8090 + name: health + livenessProbe: + httpGet: + path: /healthz?full=true + port: health + initialDelaySeconds: 3 + periodSeconds: 30 + timeoutSeconds: 5 + readinessProbe: + httpGet: + path: /healthz + port: health + initialDelaySeconds: 3 + periodSeconds: 30 + securityContext: + allowPrivilegeEscalation: false + readOnlyRootFilesystem: true + runAsNonRoot: true + capabilities: + drop: + - ALL + seccompProfile: + type: RuntimeDefault diff --git a/manifests/base/acr-controller/acr-controller-role.yaml b/manifests/base/acr-controller/acr-controller-role.yaml new file mode 100644 index 0000000000000..3a1e1991680e7 --- /dev/null +++ b/manifests/base/acr-controller/acr-controller-role.yaml @@ -0,0 +1,43 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + labels: + app.kubernetes.io/name: acr-controller + app.kubernetes.io/part-of: argocd + app.kubernetes.io/component: acr-controller + name: acr-controller +rules: +- apiGroups: + - "" + resources: + - secrets + - configmaps + verbs: + - create + - get + - list + - watch + - update + - patch + - delete +- apiGroups: + - argoproj.io + resources: + - applications + - appprojects + - applicationsets + verbs: + - create + - get + - list + - watch + - update + - delete + - patch +- apiGroups: + - "" + resources: + - events + verbs: + - create + - list diff --git a/manifests/base/acr-controller/acr-controller-rolebinding.yaml b/manifests/base/acr-controller/acr-controller-rolebinding.yaml new file mode 100644 index 0000000000000..e70280a6bc3f9 --- /dev/null +++ b/manifests/base/acr-controller/acr-controller-rolebinding.yaml @@ -0,0 +1,15 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + app.kubernetes.io/name: acr-controller + app.kubernetes.io/part-of: argocd + app.kubernetes.io/component: acr-controller + name: acr-controller +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: acr-controller +subjects: +- kind: ServiceAccount + name: acr-controller diff --git a/manifests/base/acr-controller/acr-controller-sa.yaml b/manifests/base/acr-controller/acr-controller-sa.yaml new file mode 100644 index 0000000000000..0042922267f34 --- /dev/null +++ b/manifests/base/acr-controller/acr-controller-sa.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + app.kubernetes.io/name: acr-controller + app.kubernetes.io/part-of: argocd + app.kubernetes.io/component: acr-controller + name: acr-controller diff --git a/manifests/base/acr-controller/kustomization.yaml b/manifests/base/acr-controller/kustomization.yaml new file mode 100644 index 0000000000000..93d7ff439875f --- /dev/null +++ b/manifests/base/acr-controller/kustomization.yaml @@ -0,0 +1,8 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +resources: +- acr-controller-deployment.yaml +- acr-controller-role.yaml +- acr-controller-rolebinding.yaml +- acr-controller-sa.yaml diff --git a/manifests/base/commit-server/kustomization.yaml b/manifests/base/commit-server/kustomization.yaml index 037ba5a51921b..b6f6c2037f08c 100644 --- a/manifests/base/commit-server/kustomization.yaml +++ b/manifests/base/commit-server/kustomization.yaml @@ -11,5 +11,5 @@ resources: # If/when commit-server is added to the base, this can be removed. images: - name: quay.io/argoproj/argocd - newName: quay.io/argoproj/argocd + newName: quay.io/codefresh/argocd newTag: v3.1.5 diff --git a/manifests/base/kustomization.yaml b/manifests/base/kustomization.yaml index 70706a5e2b1f6..04b34f3f29846 100644 --- a/manifests/base/kustomization.yaml +++ b/manifests/base/kustomization.yaml @@ -4,7 +4,7 @@ kind: Kustomization images: - name: quay.io/argoproj/argocd - newName: quay.io/argoproj/argocd + newName: quay.io/codefresh/argocd newTag: v3.1.5 resources: - ./application-controller diff --git a/manifests/core-install-with-hydrator.yaml b/manifests/core-install-with-hydrator.yaml index 71a1e5966a236..bddd2a61e865c 100644 --- a/manifests/core-install-with-hydrator.yaml +++ b/manifests/core-install-with-hydrator.yaml @@ -120,6 +120,12 @@ spec: attempts format: int64 type: integer + changeRevision: + type: string + changeRevisions: + items: + type: string + type: array dryRun: description: DryRun specifies to perform a `kubectl apply --dry-run` without actually performing the sync @@ -2915,6 +2921,12 @@ spec: of auto-heal attempts format: int64 type: integer + changeRevision: + type: string + changeRevisions: + items: + type: string + type: array dryRun: description: DryRun specifies to perform a `kubectl apply --dry-run` without actually performing the sync @@ -24699,7 +24711,7 @@ spec: key: applicationsetcontroller.requeue.after name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always name: argocd-applicationset-controller ports: @@ -24825,7 +24837,7 @@ spec: key: log.format.timestamp name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always livenessProbe: failureThreshold: 3 @@ -24953,7 +24965,7 @@ spec: - argocd - admin - redis-initial-password - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: IfNotPresent name: secret-init securityContext: @@ -25244,7 +25256,7 @@ spec: value: /helm-working-dir - name: HELM_DATA_HOME value: /helm-working-dir - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always livenessProbe: failureThreshold: 3 @@ -25296,7 +25308,7 @@ spec: - -n - /usr/local/bin/argocd - /var/run/argocd/argocd-cmp-server - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 name: copyutil securityContext: allowPrivilegeEscalation: false @@ -25638,7 +25650,7 @@ spec: optional: true - name: KUBECACHEDIR value: /tmp/kubecache - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always name: argocd-application-controller ports: diff --git a/manifests/core-install.yaml b/manifests/core-install.yaml index 3418748fe9128..9ee8c09be07c2 100644 --- a/manifests/core-install.yaml +++ b/manifests/core-install.yaml @@ -120,6 +120,12 @@ spec: attempts format: int64 type: integer + changeRevision: + type: string + changeRevisions: + items: + type: string + type: array dryRun: description: DryRun specifies to perform a `kubectl apply --dry-run` without actually performing the sync @@ -2915,6 +2921,12 @@ spec: of auto-heal attempts format: int64 type: integer + changeRevision: + type: string + changeRevisions: + items: + type: string + type: array dryRun: description: DryRun specifies to perform a `kubectl apply --dry-run` without actually performing the sync @@ -24667,7 +24679,7 @@ spec: key: applicationsetcontroller.requeue.after name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always name: argocd-applicationset-controller ports: @@ -24787,7 +24799,7 @@ spec: - argocd - admin - redis-initial-password - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: IfNotPresent name: secret-init securityContext: @@ -25078,7 +25090,7 @@ spec: value: /helm-working-dir - name: HELM_DATA_HOME value: /helm-working-dir - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always livenessProbe: failureThreshold: 3 @@ -25130,7 +25142,7 @@ spec: - -n - /usr/local/bin/argocd - /var/run/argocd/argocd-cmp-server - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 name: copyutil securityContext: allowPrivilegeEscalation: false @@ -25472,7 +25484,7 @@ spec: optional: true - name: KUBECACHEDIR value: /tmp/kubecache - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always name: argocd-application-controller ports: diff --git a/manifests/core-install/kustomization.yaml b/manifests/core-install/kustomization.yaml index 6d47a767d69a5..88fb274567f08 100644 --- a/manifests/core-install/kustomization.yaml +++ b/manifests/core-install/kustomization.yaml @@ -11,5 +11,5 @@ resources: - ../base/redis images: - name: quay.io/argoproj/argocd - newName: quay.io/argoproj/argocd + newName: quay.io/codefresh/argocd newTag: v3.1.5 diff --git a/manifests/crds/application-crd.yaml b/manifests/crds/application-crd.yaml index 3d644d0e5e9a4..742da1daef346 100644 --- a/manifests/crds/application-crd.yaml +++ b/manifests/crds/application-crd.yaml @@ -119,6 +119,12 @@ spec: attempts format: int64 type: integer + changeRevision: + type: string + changeRevisions: + items: + type: string + type: array dryRun: description: DryRun specifies to perform a `kubectl apply --dry-run` without actually performing the sync @@ -2914,6 +2920,12 @@ spec: of auto-heal attempts format: int64 type: integer + changeRevision: + type: string + changeRevisions: + items: + type: string + type: array dryRun: description: DryRun specifies to perform a `kubectl apply --dry-run` without actually performing the sync diff --git a/manifests/ha/base/kustomization.yaml b/manifests/ha/base/kustomization.yaml index 735d8e10a865a..fdb15622e4564 100644 --- a/manifests/ha/base/kustomization.yaml +++ b/manifests/ha/base/kustomization.yaml @@ -8,10 +8,9 @@ patches: - path: overlays/argocd-application-controller-statefulset.yaml - path: overlays/argocd-cmd-params-cm.yaml - images: - name: quay.io/argoproj/argocd - newName: quay.io/argoproj/argocd + newName: quay.io/codefresh/argocd newTag: v3.1.5 resources: - ../../base/application-controller diff --git a/manifests/ha/install-with-hydrator.yaml b/manifests/ha/install-with-hydrator.yaml index bb8f1ea1a4852..411258a59c641 100644 --- a/manifests/ha/install-with-hydrator.yaml +++ b/manifests/ha/install-with-hydrator.yaml @@ -120,6 +120,12 @@ spec: attempts format: int64 type: integer + changeRevision: + type: string + changeRevisions: + items: + type: string + type: array dryRun: description: DryRun specifies to perform a `kubectl apply --dry-run` without actually performing the sync @@ -2915,6 +2921,12 @@ spec: of auto-heal attempts format: int64 type: integer + changeRevision: + type: string + changeRevisions: + items: + type: string + type: array dryRun: description: DryRun specifies to perform a `kubectl apply --dry-run` without actually performing the sync @@ -26065,7 +26077,7 @@ spec: key: applicationsetcontroller.requeue.after name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always name: argocd-applicationset-controller ports: @@ -26191,7 +26203,7 @@ spec: key: log.format.timestamp name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always livenessProbe: failureThreshold: 3 @@ -26342,7 +26354,7 @@ spec: - -n - /usr/local/bin/argocd - /shared/argocd-dex - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always name: copyutil securityContext: @@ -26438,7 +26450,7 @@ spec: key: notificationscontroller.repo.server.plaintext name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always livenessProbe: tcpSocket: @@ -26562,7 +26574,7 @@ spec: - argocd - admin - redis-initial-password - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: IfNotPresent name: secret-init securityContext: @@ -26879,7 +26891,7 @@ spec: value: /helm-working-dir - name: HELM_DATA_HOME value: /helm-working-dir - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always livenessProbe: failureThreshold: 3 @@ -26931,7 +26943,7 @@ spec: - -n - /usr/local/bin/argocd - /var/run/argocd/argocd-cmp-server - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 name: copyutil securityContext: allowPrivilegeEscalation: false @@ -27305,7 +27317,7 @@ spec: key: server.sync.replace.allowed name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always livenessProbe: httpGet: @@ -27683,7 +27695,7 @@ spec: optional: true - name: KUBECACHEDIR value: /tmp/kubecache - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always name: argocd-application-controller ports: diff --git a/manifests/ha/install.yaml b/manifests/ha/install.yaml index 6a95849ff7460..c54ecbd35d246 100644 --- a/manifests/ha/install.yaml +++ b/manifests/ha/install.yaml @@ -120,6 +120,12 @@ spec: attempts format: int64 type: integer + changeRevision: + type: string + changeRevisions: + items: + type: string + type: array dryRun: description: DryRun specifies to perform a `kubectl apply --dry-run` without actually performing the sync @@ -2915,6 +2921,12 @@ spec: of auto-heal attempts format: int64 type: integer + changeRevision: + type: string + changeRevisions: + items: + type: string + type: array dryRun: description: DryRun specifies to perform a `kubectl apply --dry-run` without actually performing the sync @@ -26035,7 +26047,7 @@ spec: key: applicationsetcontroller.requeue.after name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always name: argocd-applicationset-controller ports: @@ -26178,7 +26190,7 @@ spec: - -n - /usr/local/bin/argocd - /shared/argocd-dex - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always name: copyutil securityContext: @@ -26274,7 +26286,7 @@ spec: key: notificationscontroller.repo.server.plaintext name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always livenessProbe: tcpSocket: @@ -26398,7 +26410,7 @@ spec: - argocd - admin - redis-initial-password - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: IfNotPresent name: secret-init securityContext: @@ -26715,7 +26727,7 @@ spec: value: /helm-working-dir - name: HELM_DATA_HOME value: /helm-working-dir - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always livenessProbe: failureThreshold: 3 @@ -26767,7 +26779,7 @@ spec: - -n - /usr/local/bin/argocd - /var/run/argocd/argocd-cmp-server - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 name: copyutil securityContext: allowPrivilegeEscalation: false @@ -27141,7 +27153,7 @@ spec: key: server.sync.replace.allowed name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always livenessProbe: httpGet: @@ -27519,7 +27531,7 @@ spec: optional: true - name: KUBECACHEDIR value: /tmp/kubecache - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always name: argocd-application-controller ports: diff --git a/manifests/ha/namespace-install-with-hydrator.yaml b/manifests/ha/namespace-install-with-hydrator.yaml index 11c05cc1309e7..3ebd2c9acc313 100644 --- a/manifests/ha/namespace-install-with-hydrator.yaml +++ b/manifests/ha/namespace-install-with-hydrator.yaml @@ -1868,7 +1868,7 @@ spec: key: applicationsetcontroller.requeue.after name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always name: argocd-applicationset-controller ports: @@ -1994,7 +1994,7 @@ spec: key: log.format.timestamp name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always livenessProbe: failureThreshold: 3 @@ -2145,7 +2145,7 @@ spec: - -n - /usr/local/bin/argocd - /shared/argocd-dex - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always name: copyutil securityContext: @@ -2241,7 +2241,7 @@ spec: key: notificationscontroller.repo.server.plaintext name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always livenessProbe: tcpSocket: @@ -2365,7 +2365,7 @@ spec: - argocd - admin - redis-initial-password - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: IfNotPresent name: secret-init securityContext: @@ -2682,7 +2682,7 @@ spec: value: /helm-working-dir - name: HELM_DATA_HOME value: /helm-working-dir - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always livenessProbe: failureThreshold: 3 @@ -2734,7 +2734,7 @@ spec: - -n - /usr/local/bin/argocd - /var/run/argocd/argocd-cmp-server - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 name: copyutil securityContext: allowPrivilegeEscalation: false @@ -3108,7 +3108,7 @@ spec: key: server.sync.replace.allowed name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always livenessProbe: httpGet: @@ -3486,7 +3486,7 @@ spec: optional: true - name: KUBECACHEDIR value: /tmp/kubecache - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always name: argocd-application-controller ports: diff --git a/manifests/ha/namespace-install.yaml b/manifests/ha/namespace-install.yaml index b3f5c5155f213..aca3ab9033de2 100644 --- a/manifests/ha/namespace-install.yaml +++ b/manifests/ha/namespace-install.yaml @@ -1838,7 +1838,7 @@ spec: key: applicationsetcontroller.requeue.after name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always name: argocd-applicationset-controller ports: @@ -1981,7 +1981,7 @@ spec: - -n - /usr/local/bin/argocd - /shared/argocd-dex - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always name: copyutil securityContext: @@ -2077,7 +2077,7 @@ spec: key: notificationscontroller.repo.server.plaintext name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always livenessProbe: tcpSocket: @@ -2201,7 +2201,7 @@ spec: - argocd - admin - redis-initial-password - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: IfNotPresent name: secret-init securityContext: @@ -2518,7 +2518,7 @@ spec: value: /helm-working-dir - name: HELM_DATA_HOME value: /helm-working-dir - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always livenessProbe: failureThreshold: 3 @@ -2570,7 +2570,7 @@ spec: - -n - /usr/local/bin/argocd - /var/run/argocd/argocd-cmp-server - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 name: copyutil securityContext: allowPrivilegeEscalation: false @@ -2944,7 +2944,7 @@ spec: key: server.sync.replace.allowed name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always livenessProbe: httpGet: @@ -3322,7 +3322,7 @@ spec: optional: true - name: KUBECACHEDIR value: /tmp/kubecache - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always name: argocd-application-controller ports: diff --git a/manifests/install-with-hydrator.yaml b/manifests/install-with-hydrator.yaml index 148119f25ee95..89e712dc87842 100644 --- a/manifests/install-with-hydrator.yaml +++ b/manifests/install-with-hydrator.yaml @@ -120,6 +120,12 @@ spec: attempts format: int64 type: integer + changeRevision: + type: string + changeRevisions: + items: + type: string + type: array dryRun: description: DryRun specifies to perform a `kubectl apply --dry-run` without actually performing the sync @@ -2915,6 +2921,12 @@ spec: of auto-heal attempts format: int64 type: integer + changeRevision: + type: string + changeRevisions: + items: + type: string + type: array dryRun: description: DryRun specifies to perform a `kubectl apply --dry-run` without actually performing the sync @@ -25159,7 +25171,7 @@ spec: key: applicationsetcontroller.requeue.after name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always name: argocd-applicationset-controller ports: @@ -25285,7 +25297,7 @@ spec: key: log.format.timestamp name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always livenessProbe: failureThreshold: 3 @@ -25436,7 +25448,7 @@ spec: - -n - /usr/local/bin/argocd - /shared/argocd-dex - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always name: copyutil securityContext: @@ -25532,7 +25544,7 @@ spec: key: notificationscontroller.repo.server.plaintext name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always livenessProbe: tcpSocket: @@ -25634,7 +25646,7 @@ spec: - argocd - admin - redis-initial-password - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: IfNotPresent name: secret-init securityContext: @@ -25925,7 +25937,7 @@ spec: value: /helm-working-dir - name: HELM_DATA_HOME value: /helm-working-dir - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always livenessProbe: failureThreshold: 3 @@ -25977,7 +25989,7 @@ spec: - -n - /usr/local/bin/argocd - /var/run/argocd/argocd-cmp-server - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 name: copyutil securityContext: allowPrivilegeEscalation: false @@ -26349,7 +26361,7 @@ spec: key: server.sync.replace.allowed name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always livenessProbe: httpGet: @@ -26727,7 +26739,7 @@ spec: optional: true - name: KUBECACHEDIR value: /tmp/kubecache - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always name: argocd-application-controller ports: diff --git a/manifests/install.yaml b/manifests/install.yaml index e4f77166bf758..094c405892a44 100644 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -120,6 +120,12 @@ spec: attempts format: int64 type: integer + changeRevision: + type: string + changeRevisions: + items: + type: string + type: array dryRun: description: DryRun specifies to perform a `kubectl apply --dry-run` without actually performing the sync @@ -2915,6 +2921,12 @@ spec: of auto-heal attempts format: int64 type: integer + changeRevision: + type: string + changeRevisions: + items: + type: string + type: array dryRun: description: DryRun specifies to perform a `kubectl apply --dry-run` without actually performing the sync @@ -25127,7 +25139,7 @@ spec: key: applicationsetcontroller.requeue.after name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always name: argocd-applicationset-controller ports: @@ -25270,7 +25282,7 @@ spec: - -n - /usr/local/bin/argocd - /shared/argocd-dex - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always name: copyutil securityContext: @@ -25366,7 +25378,7 @@ spec: key: notificationscontroller.repo.server.plaintext name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always livenessProbe: tcpSocket: @@ -25468,7 +25480,7 @@ spec: - argocd - admin - redis-initial-password - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: IfNotPresent name: secret-init securityContext: @@ -25759,7 +25771,7 @@ spec: value: /helm-working-dir - name: HELM_DATA_HOME value: /helm-working-dir - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always livenessProbe: failureThreshold: 3 @@ -25811,7 +25823,7 @@ spec: - -n - /usr/local/bin/argocd - /var/run/argocd/argocd-cmp-server - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 name: copyutil securityContext: allowPrivilegeEscalation: false @@ -26183,7 +26195,7 @@ spec: key: server.sync.replace.allowed name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always livenessProbe: httpGet: @@ -26561,7 +26573,7 @@ spec: optional: true - name: KUBECACHEDIR value: /tmp/kubecache - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always name: argocd-application-controller ports: diff --git a/manifests/namespace-install-with-hydrator.yaml b/manifests/namespace-install-with-hydrator.yaml index e9b5e715d9170..c71f00e31441e 100644 --- a/manifests/namespace-install-with-hydrator.yaml +++ b/manifests/namespace-install-with-hydrator.yaml @@ -962,7 +962,7 @@ spec: key: applicationsetcontroller.requeue.after name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always name: argocd-applicationset-controller ports: @@ -1088,7 +1088,7 @@ spec: key: log.format.timestamp name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always livenessProbe: failureThreshold: 3 @@ -1239,7 +1239,7 @@ spec: - -n - /usr/local/bin/argocd - /shared/argocd-dex - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always name: copyutil securityContext: @@ -1335,7 +1335,7 @@ spec: key: notificationscontroller.repo.server.plaintext name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always livenessProbe: tcpSocket: @@ -1437,7 +1437,7 @@ spec: - argocd - admin - redis-initial-password - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: IfNotPresent name: secret-init securityContext: @@ -1728,7 +1728,7 @@ spec: value: /helm-working-dir - name: HELM_DATA_HOME value: /helm-working-dir - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always livenessProbe: failureThreshold: 3 @@ -1780,7 +1780,7 @@ spec: - -n - /usr/local/bin/argocd - /var/run/argocd/argocd-cmp-server - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 name: copyutil securityContext: allowPrivilegeEscalation: false @@ -2152,7 +2152,7 @@ spec: key: server.sync.replace.allowed name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always livenessProbe: httpGet: @@ -2530,7 +2530,7 @@ spec: optional: true - name: KUBECACHEDIR value: /tmp/kubecache - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always name: argocd-application-controller ports: diff --git a/manifests/namespace-install.yaml b/manifests/namespace-install.yaml index d5aa2fbadb6fe..45e5b0d97366c 100644 --- a/manifests/namespace-install.yaml +++ b/manifests/namespace-install.yaml @@ -930,7 +930,7 @@ spec: key: applicationsetcontroller.requeue.after name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always name: argocd-applicationset-controller ports: @@ -1073,7 +1073,7 @@ spec: - -n - /usr/local/bin/argocd - /shared/argocd-dex - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always name: copyutil securityContext: @@ -1169,7 +1169,7 @@ spec: key: notificationscontroller.repo.server.plaintext name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always livenessProbe: tcpSocket: @@ -1271,7 +1271,7 @@ spec: - argocd - admin - redis-initial-password - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: IfNotPresent name: secret-init securityContext: @@ -1562,7 +1562,7 @@ spec: value: /helm-working-dir - name: HELM_DATA_HOME value: /helm-working-dir - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always livenessProbe: failureThreshold: 3 @@ -1614,7 +1614,7 @@ spec: - -n - /usr/local/bin/argocd - /var/run/argocd/argocd-cmp-server - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 name: copyutil securityContext: allowPrivilegeEscalation: false @@ -1986,7 +1986,7 @@ spec: key: server.sync.replace.allowed name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always livenessProbe: httpGet: @@ -2364,7 +2364,7 @@ spec: optional: true - name: KUBECACHEDIR value: /tmp/kubecache - image: quay.io/argoproj/argocd:v3.1.5 + image: quay.io/codefresh/argocd:v3.1.5 imagePullPolicy: Always name: argocd-application-controller ports: diff --git a/pkg/apiclient/application/application.pb.go b/pkg/apiclient/application/application.pb.go index 76b7859f2f0b0..ae8e8843a0537 100644 --- a/pkg/apiclient/application/application.pb.go +++ b/pkg/apiclient/application/application.pb.go @@ -725,6 +725,116 @@ func (m *ApplicationResponse) XXX_DiscardUnknown() { var xxx_messageInfo_ApplicationResponse proto.InternalMessageInfo +type ApplicationValidateResponse struct { + Error *string `protobuf:"bytes,1,opt,name=error" json:"error,omitempty"` + Entity *string `protobuf:"bytes,2,opt,name=entity" json:"entity,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ApplicationValidateResponse) Reset() { *m = ApplicationValidateResponse{} } +func (m *ApplicationValidateResponse) String() string { return proto.CompactTextString(m) } +func (*ApplicationValidateResponse) ProtoMessage() {} +func (*ApplicationValidateResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_df6e82b174b5eaec, []int{9} +} +func (m *ApplicationValidateResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ApplicationValidateResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ApplicationValidateResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ApplicationValidateResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ApplicationValidateResponse.Merge(m, src) +} +func (m *ApplicationValidateResponse) XXX_Size() int { + return m.Size() +} +func (m *ApplicationValidateResponse) XXX_DiscardUnknown() { + xxx_messageInfo_ApplicationValidateResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_ApplicationValidateResponse proto.InternalMessageInfo + +func (m *ApplicationValidateResponse) GetError() string { + if m != nil && m.Error != nil { + return *m.Error + } + return "" +} + +func (m *ApplicationValidateResponse) GetEntity() string { + if m != nil && m.Entity != nil { + return *m.Entity + } + return "" +} + +type ApplicationRolloutRollbackResponse struct { + Rollout *string `protobuf:"bytes,1,req,name=rollout" json:"rollout,omitempty"` + NewRevision *int64 `protobuf:"varint,2,req,name=newRevision" json:"newRevision,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ApplicationRolloutRollbackResponse) Reset() { *m = ApplicationRolloutRollbackResponse{} } +func (m *ApplicationRolloutRollbackResponse) String() string { return proto.CompactTextString(m) } +func (*ApplicationRolloutRollbackResponse) ProtoMessage() {} +func (*ApplicationRolloutRollbackResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_df6e82b174b5eaec, []int{10} +} +func (m *ApplicationRolloutRollbackResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ApplicationRolloutRollbackResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ApplicationRolloutRollbackResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ApplicationRolloutRollbackResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ApplicationRolloutRollbackResponse.Merge(m, src) +} +func (m *ApplicationRolloutRollbackResponse) XXX_Size() int { + return m.Size() +} +func (m *ApplicationRolloutRollbackResponse) XXX_DiscardUnknown() { + xxx_messageInfo_ApplicationRolloutRollbackResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_ApplicationRolloutRollbackResponse proto.InternalMessageInfo + +func (m *ApplicationRolloutRollbackResponse) GetRollout() string { + if m != nil && m.Rollout != nil { + return *m.Rollout + } + return "" +} + +func (m *ApplicationRolloutRollbackResponse) GetNewRevision() int64 { + if m != nil && m.NewRevision != nil { + return *m.NewRevision + } + return 0 +} + type ApplicationCreateRequest struct { Application *v1alpha1.Application `protobuf:"bytes,1,req,name=application" json:"application,omitempty"` Upsert *bool `protobuf:"varint,2,opt,name=upsert" json:"upsert,omitempty"` @@ -738,7 +848,7 @@ func (m *ApplicationCreateRequest) Reset() { *m = ApplicationCreateReque func (m *ApplicationCreateRequest) String() string { return proto.CompactTextString(m) } func (*ApplicationCreateRequest) ProtoMessage() {} func (*ApplicationCreateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{9} + return fileDescriptor_df6e82b174b5eaec, []int{11} } func (m *ApplicationCreateRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -801,7 +911,7 @@ func (m *ApplicationUpdateRequest) Reset() { *m = ApplicationUpdateReque func (m *ApplicationUpdateRequest) String() string { return proto.CompactTextString(m) } func (*ApplicationUpdateRequest) ProtoMessage() {} func (*ApplicationUpdateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{10} + return fileDescriptor_df6e82b174b5eaec, []int{12} } func (m *ApplicationUpdateRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -866,7 +976,7 @@ func (m *ApplicationDeleteRequest) Reset() { *m = ApplicationDeleteReque func (m *ApplicationDeleteRequest) String() string { return proto.CompactTextString(m) } func (*ApplicationDeleteRequest) ProtoMessage() {} func (*ApplicationDeleteRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{11} + return fileDescriptor_df6e82b174b5eaec, []int{13} } func (m *ApplicationDeleteRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -941,7 +1051,7 @@ func (m *SyncOptions) Reset() { *m = SyncOptions{} } func (m *SyncOptions) String() string { return proto.CompactTextString(m) } func (*SyncOptions) ProtoMessage() {} func (*SyncOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{12} + return fileDescriptor_df6e82b174b5eaec, []int{14} } func (m *SyncOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1002,7 +1112,7 @@ func (m *ApplicationSyncRequest) Reset() { *m = ApplicationSyncRequest{} func (m *ApplicationSyncRequest) String() string { return proto.CompactTextString(m) } func (*ApplicationSyncRequest) ProtoMessage() {} func (*ApplicationSyncRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{13} + return fileDescriptor_df6e82b174b5eaec, []int{15} } func (m *ApplicationSyncRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1145,7 +1255,7 @@ func (m *ApplicationUpdateSpecRequest) Reset() { *m = ApplicationUpdateS func (m *ApplicationUpdateSpecRequest) String() string { return proto.CompactTextString(m) } func (*ApplicationUpdateSpecRequest) ProtoMessage() {} func (*ApplicationUpdateSpecRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{14} + return fileDescriptor_df6e82b174b5eaec, []int{16} } func (m *ApplicationUpdateSpecRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1225,7 +1335,7 @@ func (m *ApplicationPatchRequest) Reset() { *m = ApplicationPatchRequest func (m *ApplicationPatchRequest) String() string { return proto.CompactTextString(m) } func (*ApplicationPatchRequest) ProtoMessage() {} func (*ApplicationPatchRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{15} + return fileDescriptor_df6e82b174b5eaec, []int{17} } func (m *ApplicationPatchRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1289,6 +1399,132 @@ func (m *ApplicationPatchRequest) GetProject() string { return "" } +type ApplicationValidationRequest struct { + Application *v1alpha1.Application `protobuf:"bytes,1,req,name=application" json:"application,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ApplicationValidationRequest) Reset() { *m = ApplicationValidationRequest{} } +func (m *ApplicationValidationRequest) String() string { return proto.CompactTextString(m) } +func (*ApplicationValidationRequest) ProtoMessage() {} +func (*ApplicationValidationRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_df6e82b174b5eaec, []int{18} +} +func (m *ApplicationValidationRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ApplicationValidationRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ApplicationValidationRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ApplicationValidationRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ApplicationValidationRequest.Merge(m, src) +} +func (m *ApplicationValidationRequest) XXX_Size() int { + return m.Size() +} +func (m *ApplicationValidationRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ApplicationValidationRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ApplicationValidationRequest proto.InternalMessageInfo + +func (m *ApplicationValidationRequest) GetApplication() *v1alpha1.Application { + if m != nil { + return m.Application + } + return nil +} + +type ApplicationRolloutRollbackRequest struct { + Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"` + Namespace *string `protobuf:"bytes,2,req,name=namespace" json:"namespace,omitempty"` + RolloutName *string `protobuf:"bytes,3,req,name=rolloutName" json:"rolloutName,omitempty"` + RolloutNamespace *string `protobuf:"bytes,4,req,name=rolloutNamespace" json:"rolloutNamespace,omitempty"` + RolloutRevision *int64 `protobuf:"varint,5,req,name=rolloutRevision" json:"rolloutRevision,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ApplicationRolloutRollbackRequest) Reset() { *m = ApplicationRolloutRollbackRequest{} } +func (m *ApplicationRolloutRollbackRequest) String() string { return proto.CompactTextString(m) } +func (*ApplicationRolloutRollbackRequest) ProtoMessage() {} +func (*ApplicationRolloutRollbackRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_df6e82b174b5eaec, []int{19} +} +func (m *ApplicationRolloutRollbackRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ApplicationRolloutRollbackRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ApplicationRolloutRollbackRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ApplicationRolloutRollbackRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ApplicationRolloutRollbackRequest.Merge(m, src) +} +func (m *ApplicationRolloutRollbackRequest) XXX_Size() int { + return m.Size() +} +func (m *ApplicationRolloutRollbackRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ApplicationRolloutRollbackRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ApplicationRolloutRollbackRequest proto.InternalMessageInfo + +func (m *ApplicationRolloutRollbackRequest) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *ApplicationRolloutRollbackRequest) GetNamespace() string { + if m != nil && m.Namespace != nil { + return *m.Namespace + } + return "" +} + +func (m *ApplicationRolloutRollbackRequest) GetRolloutName() string { + if m != nil && m.RolloutName != nil { + return *m.RolloutName + } + return "" +} + +func (m *ApplicationRolloutRollbackRequest) GetRolloutNamespace() string { + if m != nil && m.RolloutNamespace != nil { + return *m.RolloutNamespace + } + return "" +} + +func (m *ApplicationRolloutRollbackRequest) GetRolloutRevision() int64 { + if m != nil && m.RolloutRevision != nil { + return *m.RolloutRevision + } + return 0 +} + type ApplicationRollbackRequest struct { Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"` Id *int64 `protobuf:"varint,2,req,name=id" json:"id,omitempty"` @@ -1305,7 +1541,7 @@ func (m *ApplicationRollbackRequest) Reset() { *m = ApplicationRollbackR func (m *ApplicationRollbackRequest) String() string { return proto.CompactTextString(m) } func (*ApplicationRollbackRequest) ProtoMessage() {} func (*ApplicationRollbackRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{16} + return fileDescriptor_df6e82b174b5eaec, []int{20} } func (m *ApplicationRollbackRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1394,7 +1630,7 @@ func (m *ApplicationResourceRequest) Reset() { *m = ApplicationResourceR func (m *ApplicationResourceRequest) String() string { return proto.CompactTextString(m) } func (*ApplicationResourceRequest) ProtoMessage() {} func (*ApplicationResourceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{17} + return fileDescriptor_df6e82b174b5eaec, []int{21} } func (m *ApplicationResourceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1499,7 +1735,7 @@ func (m *ApplicationResourcePatchRequest) Reset() { *m = ApplicationReso func (m *ApplicationResourcePatchRequest) String() string { return proto.CompactTextString(m) } func (*ApplicationResourcePatchRequest) ProtoMessage() {} func (*ApplicationResourcePatchRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{18} + return fileDescriptor_df6e82b174b5eaec, []int{22} } func (m *ApplicationResourcePatchRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1598,6 +1834,124 @@ func (m *ApplicationResourcePatchRequest) GetProject() string { return "" } +type ChangeRevisionRequest struct { + AppName *string `protobuf:"bytes,1,req,name=appName" json:"appName,omitempty"` + Namespace *string `protobuf:"bytes,2,opt,name=namespace" json:"namespace,omitempty"` + CurrentRevision *string `protobuf:"bytes,3,opt,name=currentRevision" json:"currentRevision,omitempty"` + PreviousRevision *string `protobuf:"bytes,4,opt,name=previousRevision" json:"previousRevision,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ChangeRevisionRequest) Reset() { *m = ChangeRevisionRequest{} } +func (m *ChangeRevisionRequest) String() string { return proto.CompactTextString(m) } +func (*ChangeRevisionRequest) ProtoMessage() {} +func (*ChangeRevisionRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_df6e82b174b5eaec, []int{23} +} +func (m *ChangeRevisionRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ChangeRevisionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ChangeRevisionRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ChangeRevisionRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ChangeRevisionRequest.Merge(m, src) +} +func (m *ChangeRevisionRequest) XXX_Size() int { + return m.Size() +} +func (m *ChangeRevisionRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ChangeRevisionRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ChangeRevisionRequest proto.InternalMessageInfo + +func (m *ChangeRevisionRequest) GetAppName() string { + if m != nil && m.AppName != nil { + return *m.AppName + } + return "" +} + +func (m *ChangeRevisionRequest) GetNamespace() string { + if m != nil && m.Namespace != nil { + return *m.Namespace + } + return "" +} + +func (m *ChangeRevisionRequest) GetCurrentRevision() string { + if m != nil && m.CurrentRevision != nil { + return *m.CurrentRevision + } + return "" +} + +func (m *ChangeRevisionRequest) GetPreviousRevision() string { + if m != nil && m.PreviousRevision != nil { + return *m.PreviousRevision + } + return "" +} + +type ChangeRevisionResponse struct { + Revision *string `protobuf:"bytes,1,req,name=revision" json:"revision,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ChangeRevisionResponse) Reset() { *m = ChangeRevisionResponse{} } +func (m *ChangeRevisionResponse) String() string { return proto.CompactTextString(m) } +func (*ChangeRevisionResponse) ProtoMessage() {} +func (*ChangeRevisionResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_df6e82b174b5eaec, []int{24} +} +func (m *ChangeRevisionResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ChangeRevisionResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ChangeRevisionResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ChangeRevisionResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ChangeRevisionResponse.Merge(m, src) +} +func (m *ChangeRevisionResponse) XXX_Size() int { + return m.Size() +} +func (m *ChangeRevisionResponse) XXX_DiscardUnknown() { + xxx_messageInfo_ChangeRevisionResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_ChangeRevisionResponse proto.InternalMessageInfo + +func (m *ChangeRevisionResponse) GetRevision() string { + if m != nil && m.Revision != nil { + return *m.Revision + } + return "" +} + type ApplicationResourceDeleteRequest struct { Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"` Namespace *string `protobuf:"bytes,2,opt,name=namespace" json:"namespace,omitempty"` @@ -1618,7 +1972,7 @@ func (m *ApplicationResourceDeleteRequest) Reset() { *m = ApplicationRes func (m *ApplicationResourceDeleteRequest) String() string { return proto.CompactTextString(m) } func (*ApplicationResourceDeleteRequest) ProtoMessage() {} func (*ApplicationResourceDeleteRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{19} + return fileDescriptor_df6e82b174b5eaec, []int{25} } func (m *ApplicationResourceDeleteRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1729,7 +2083,7 @@ func (m *ResourceActionParameters) Reset() { *m = ResourceActionParamete func (m *ResourceActionParameters) String() string { return proto.CompactTextString(m) } func (*ResourceActionParameters) ProtoMessage() {} func (*ResourceActionParameters) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{20} + return fileDescriptor_df6e82b174b5eaec, []int{26} } func (m *ResourceActionParameters) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1795,7 +2149,7 @@ func (m *ResourceActionRunRequest) Reset() { *m = ResourceActionRunReque func (m *ResourceActionRunRequest) String() string { return proto.CompactTextString(m) } func (*ResourceActionRunRequest) ProtoMessage() {} func (*ResourceActionRunRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{21} + return fileDescriptor_df6e82b174b5eaec, []int{27} } func (m *ResourceActionRunRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1907,7 +2261,7 @@ func (m *ResourceActionRunRequestV2) Reset() { *m = ResourceActionRunReq func (m *ResourceActionRunRequestV2) String() string { return proto.CompactTextString(m) } func (*ResourceActionRunRequestV2) ProtoMessage() {} func (*ResourceActionRunRequestV2) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{22} + return fileDescriptor_df6e82b174b5eaec, []int{28} } func (m *ResourceActionRunRequestV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2017,7 +2371,7 @@ func (m *ResourceActionsListResponse) Reset() { *m = ResourceActionsList func (m *ResourceActionsListResponse) String() string { return proto.CompactTextString(m) } func (*ResourceActionsListResponse) ProtoMessage() {} func (*ResourceActionsListResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{23} + return fileDescriptor_df6e82b174b5eaec, []int{29} } func (m *ResourceActionsListResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2064,7 +2418,7 @@ func (m *ApplicationResourceResponse) Reset() { *m = ApplicationResource func (m *ApplicationResourceResponse) String() string { return proto.CompactTextString(m) } func (*ApplicationResourceResponse) ProtoMessage() {} func (*ApplicationResourceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{24} + return fileDescriptor_df6e82b174b5eaec, []int{30} } func (m *ApplicationResourceResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2127,7 +2481,7 @@ func (m *ApplicationPodLogsQuery) Reset() { *m = ApplicationPodLogsQuery func (m *ApplicationPodLogsQuery) String() string { return proto.CompactTextString(m) } func (*ApplicationPodLogsQuery) ProtoMessage() {} func (*ApplicationPodLogsQuery) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{25} + return fileDescriptor_df6e82b174b5eaec, []int{31} } func (m *ApplicationPodLogsQuery) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2291,7 +2645,7 @@ func (m *LogEntry) Reset() { *m = LogEntry{} } func (m *LogEntry) String() string { return proto.CompactTextString(m) } func (*LogEntry) ProtoMessage() {} func (*LogEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{26} + return fileDescriptor_df6e82b174b5eaec, []int{32} } func (m *LogEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2368,7 +2722,7 @@ func (m *OperationTerminateRequest) Reset() { *m = OperationTerminateReq func (m *OperationTerminateRequest) String() string { return proto.CompactTextString(m) } func (*OperationTerminateRequest) ProtoMessage() {} func (*OperationTerminateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{27} + return fileDescriptor_df6e82b174b5eaec, []int{33} } func (m *OperationTerminateRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2431,7 +2785,7 @@ func (m *ApplicationSyncWindowsQuery) Reset() { *m = ApplicationSyncWind func (m *ApplicationSyncWindowsQuery) String() string { return proto.CompactTextString(m) } func (*ApplicationSyncWindowsQuery) ProtoMessage() {} func (*ApplicationSyncWindowsQuery) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{28} + return fileDescriptor_df6e82b174b5eaec, []int{34} } func (m *ApplicationSyncWindowsQuery) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2494,7 +2848,7 @@ func (m *ApplicationSyncWindowsResponse) Reset() { *m = ApplicationSyncW func (m *ApplicationSyncWindowsResponse) String() string { return proto.CompactTextString(m) } func (*ApplicationSyncWindowsResponse) ProtoMessage() {} func (*ApplicationSyncWindowsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{29} + return fileDescriptor_df6e82b174b5eaec, []int{35} } func (m *ApplicationSyncWindowsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2558,7 +2912,7 @@ func (m *ApplicationSyncWindow) Reset() { *m = ApplicationSyncWindow{} } func (m *ApplicationSyncWindow) String() string { return proto.CompactTextString(m) } func (*ApplicationSyncWindow) ProtoMessage() {} func (*ApplicationSyncWindow) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{30} + return fileDescriptor_df6e82b174b5eaec, []int{36} } func (m *ApplicationSyncWindow) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2625,7 +2979,7 @@ func (m *OperationTerminateResponse) Reset() { *m = OperationTerminateRe func (m *OperationTerminateResponse) String() string { return proto.CompactTextString(m) } func (*OperationTerminateResponse) ProtoMessage() {} func (*OperationTerminateResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{31} + return fileDescriptor_df6e82b174b5eaec, []int{37} } func (m *OperationTerminateResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2672,7 +3026,7 @@ func (m *ResourcesQuery) Reset() { *m = ResourcesQuery{} } func (m *ResourcesQuery) String() string { return proto.CompactTextString(m) } func (*ResourcesQuery) ProtoMessage() {} func (*ResourcesQuery) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{32} + return fileDescriptor_df6e82b174b5eaec, []int{38} } func (m *ResourcesQuery) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2768,7 +3122,7 @@ func (m *ManagedResourcesResponse) Reset() { *m = ManagedResourcesRespon func (m *ManagedResourcesResponse) String() string { return proto.CompactTextString(m) } func (*ManagedResourcesResponse) ProtoMessage() {} func (*ManagedResourcesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{33} + return fileDescriptor_df6e82b174b5eaec, []int{39} } func (m *ManagedResourcesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2818,7 +3172,7 @@ func (m *LinkInfo) Reset() { *m = LinkInfo{} } func (m *LinkInfo) String() string { return proto.CompactTextString(m) } func (*LinkInfo) ProtoMessage() {} func (*LinkInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{34} + return fileDescriptor_df6e82b174b5eaec, []int{40} } func (m *LinkInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2886,7 +3240,7 @@ func (m *LinksResponse) Reset() { *m = LinksResponse{} } func (m *LinksResponse) String() string { return proto.CompactTextString(m) } func (*LinksResponse) ProtoMessage() {} func (*LinksResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{35} + return fileDescriptor_df6e82b174b5eaec, []int{41} } func (m *LinksResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2935,7 +3289,7 @@ func (m *ListAppLinksRequest) Reset() { *m = ListAppLinksRequest{} } func (m *ListAppLinksRequest) String() string { return proto.CompactTextString(m) } func (*ListAppLinksRequest) ProtoMessage() {} func (*ListAppLinksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{36} + return fileDescriptor_df6e82b174b5eaec, []int{42} } func (m *ListAppLinksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2995,6 +3349,8 @@ func init() { proto.RegisterType((*ApplicationManifestQueryWithFiles)(nil), "application.ApplicationManifestQueryWithFiles") proto.RegisterType((*ApplicationManifestQueryWithFilesWrapper)(nil), "application.ApplicationManifestQueryWithFilesWrapper") proto.RegisterType((*ApplicationResponse)(nil), "application.ApplicationResponse") + proto.RegisterType((*ApplicationValidateResponse)(nil), "application.ApplicationValidateResponse") + proto.RegisterType((*ApplicationRolloutRollbackResponse)(nil), "application.ApplicationRolloutRollbackResponse") proto.RegisterType((*ApplicationCreateRequest)(nil), "application.ApplicationCreateRequest") proto.RegisterType((*ApplicationUpdateRequest)(nil), "application.ApplicationUpdateRequest") proto.RegisterType((*ApplicationDeleteRequest)(nil), "application.ApplicationDeleteRequest") @@ -3002,9 +3358,13 @@ func init() { proto.RegisterType((*ApplicationSyncRequest)(nil), "application.ApplicationSyncRequest") proto.RegisterType((*ApplicationUpdateSpecRequest)(nil), "application.ApplicationUpdateSpecRequest") proto.RegisterType((*ApplicationPatchRequest)(nil), "application.ApplicationPatchRequest") + proto.RegisterType((*ApplicationValidationRequest)(nil), "application.ApplicationValidationRequest") + proto.RegisterType((*ApplicationRolloutRollbackRequest)(nil), "application.ApplicationRolloutRollbackRequest") proto.RegisterType((*ApplicationRollbackRequest)(nil), "application.ApplicationRollbackRequest") proto.RegisterType((*ApplicationResourceRequest)(nil), "application.ApplicationResourceRequest") proto.RegisterType((*ApplicationResourcePatchRequest)(nil), "application.ApplicationResourcePatchRequest") + proto.RegisterType((*ChangeRevisionRequest)(nil), "application.ChangeRevisionRequest") + proto.RegisterType((*ChangeRevisionResponse)(nil), "application.ChangeRevisionResponse") proto.RegisterType((*ApplicationResourceDeleteRequest)(nil), "application.ApplicationResourceDeleteRequest") proto.RegisterType((*ResourceActionParameters)(nil), "application.ResourceActionParameters") proto.RegisterType((*ResourceActionRunRequest)(nil), "application.ResourceActionRunRequest") @@ -3030,188 +3390,199 @@ func init() { } var fileDescriptor_df6e82b174b5eaec = []byte{ - // 2885 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5a, 0xcf, 0x8f, 0x1c, 0x47, - 0xf5, 0xff, 0xd6, 0xcc, 0xce, 0xee, 0xec, 0x1b, 0xff, 0xac, 0xd8, 0xfe, 0x76, 0xc6, 0x1b, 0x33, - 0x69, 0xff, 0x9a, 0xac, 0xbd, 0x33, 0xf6, 0xc4, 0xa0, 0x64, 0x93, 0x10, 0x9c, 0xb5, 0xe3, 0x2c, - 0xac, 0x1d, 0xd3, 0xeb, 0xc4, 0x28, 0x1c, 0xa0, 0xd2, 0x5d, 0x3b, 0xd3, 0x6c, 0x4f, 0x77, 0xbb, - 0xbb, 0x67, 0xc2, 0x2a, 0xe4, 0x12, 0x84, 0xc4, 0x21, 0x0a, 0x02, 0x72, 0xe0, 0xc0, 0x2f, 0x25, - 0x8a, 0x84, 0x10, 0x88, 0x0b, 0x42, 0x48, 0x08, 0x09, 0x0e, 0x41, 0x70, 0x40, 0x8a, 0xe0, 0x1f, - 0x40, 0x11, 0xe2, 0x48, 0x2e, 0x39, 0x23, 0x54, 0xd5, 0x55, 0xdd, 0xd5, 0xf3, 0xa3, 0x67, 0x96, - 0x19, 0x14, 0x4b, 0xdc, 0xfa, 0xd5, 0x54, 0xbd, 0xf7, 0x79, 0xaf, 0x5e, 0xbd, 0x57, 0xf5, 0xde, - 0xc0, 0x99, 0x90, 0x06, 0x7d, 0x1a, 0x34, 0x89, 0xef, 0x3b, 0xb6, 0x49, 0x22, 0xdb, 0x73, 0xd5, - 0xef, 0x86, 0x1f, 0x78, 0x91, 0x87, 0x2b, 0xca, 0x50, 0x75, 0xa5, 0xed, 0x79, 0x6d, 0x87, 0x36, - 0x89, 0x6f, 0x37, 0x89, 0xeb, 0x7a, 0x11, 0x1f, 0x0e, 0xe3, 0xa9, 0x55, 0x7d, 0xf7, 0xb1, 0xb0, - 0x61, 0x7b, 0xfc, 0x57, 0xd3, 0x0b, 0x68, 0xb3, 0x7f, 0xb9, 0xd9, 0xa6, 0x2e, 0x0d, 0x48, 0x44, - 0x2d, 0x31, 0xe7, 0x4a, 0x3a, 0xa7, 0x4b, 0xcc, 0x8e, 0xed, 0xd2, 0x60, 0xaf, 0xe9, 0xef, 0xb6, - 0xd9, 0x40, 0xd8, 0xec, 0xd2, 0x88, 0x8c, 0x5a, 0xb5, 0xd5, 0xb6, 0xa3, 0x4e, 0xef, 0xe5, 0x86, - 0xe9, 0x75, 0x9b, 0x24, 0x68, 0x7b, 0x7e, 0xe0, 0x7d, 0x85, 0x7f, 0xac, 0x99, 0x56, 0xb3, 0xff, - 0x68, 0xca, 0x40, 0xd5, 0xa5, 0x7f, 0x99, 0x38, 0x7e, 0x87, 0x0c, 0x73, 0xbb, 0x3e, 0x81, 0x5b, - 0x40, 0x7d, 0x4f, 0xd8, 0x86, 0x7f, 0xda, 0x91, 0x17, 0xec, 0x29, 0x9f, 0x31, 0x1b, 0xfd, 0x23, - 0x04, 0x47, 0xae, 0xa6, 0xf2, 0x3e, 0xdf, 0xa3, 0xc1, 0x1e, 0xc6, 0xb0, 0xe0, 0x92, 0x2e, 0xd5, - 0x50, 0x0d, 0xd5, 0x97, 0x0d, 0xfe, 0x8d, 0x35, 0x58, 0x0a, 0xe8, 0x4e, 0x40, 0xc3, 0x8e, 0x56, - 0xe0, 0xc3, 0x92, 0xc4, 0x55, 0x28, 0x33, 0xe1, 0xd4, 0x8c, 0x42, 0xad, 0x58, 0x2b, 0xd6, 0x97, - 0x8d, 0x84, 0xc6, 0x75, 0x38, 0x1c, 0xd0, 0xd0, 0xeb, 0x05, 0x26, 0x7d, 0x91, 0x06, 0xa1, 0xed, - 0xb9, 0xda, 0x02, 0x5f, 0x3d, 0x38, 0xcc, 0xb8, 0x84, 0xd4, 0xa1, 0x66, 0xe4, 0x05, 0x5a, 0x89, - 0x4f, 0x49, 0x68, 0x86, 0x87, 0x01, 0xd7, 0x16, 0x63, 0x3c, 0xec, 0x1b, 0xeb, 0x70, 0x80, 0xf8, - 0xfe, 0x2d, 0xd2, 0xa5, 0xa1, 0x4f, 0x4c, 0xaa, 0x2d, 0xf1, 0xdf, 0x32, 0x63, 0x0c, 0xb3, 0x40, - 0xa2, 0x95, 0x39, 0x30, 0x49, 0xea, 0x1b, 0xb0, 0x7c, 0xcb, 0xb3, 0xe8, 0x78, 0x75, 0x07, 0xd9, - 0x17, 0x86, 0xd9, 0xeb, 0xef, 0x21, 0x38, 0x6e, 0xd0, 0xbe, 0xcd, 0xf0, 0xdf, 0xa4, 0x11, 0xb1, - 0x48, 0x44, 0x06, 0x39, 0x16, 0x12, 0x8e, 0x55, 0x28, 0x07, 0x62, 0xb2, 0x56, 0xe0, 0xe3, 0x09, - 0x3d, 0x24, 0xad, 0x98, 0xaf, 0x4c, 0x6c, 0x42, 0x49, 0xe2, 0x1a, 0x54, 0x62, 0x5b, 0x6e, 0xba, - 0x16, 0xfd, 0x2a, 0xb7, 0x5e, 0xc9, 0x50, 0x87, 0xf0, 0x0a, 0x2c, 0xf7, 0x63, 0x3b, 0x6f, 0x5a, - 0xdc, 0x8a, 0x25, 0x23, 0x1d, 0xd0, 0xff, 0x81, 0xe0, 0x94, 0xe2, 0x03, 0x86, 0xd8, 0x99, 0xeb, - 0x7d, 0xea, 0x46, 0xe1, 0x78, 0x85, 0x2e, 0xc2, 0x51, 0xb9, 0x89, 0x83, 0x76, 0x1a, 0xfe, 0x81, - 0xa9, 0xa8, 0x0e, 0x4a, 0x15, 0xd5, 0x31, 0xa6, 0x88, 0xa4, 0x5f, 0xd8, 0xbc, 0x26, 0xd4, 0x54, - 0x87, 0x86, 0x0c, 0x55, 0xca, 0x37, 0xd4, 0x62, 0xc6, 0x50, 0xfa, 0xfb, 0x08, 0x34, 0x45, 0xd1, - 0x9b, 0xc4, 0xb5, 0x77, 0x68, 0x18, 0x4d, 0xbb, 0x67, 0x68, 0x8e, 0x7b, 0x56, 0x87, 0xc3, 0xb1, - 0x56, 0xb7, 0xd9, 0x79, 0x64, 0xf1, 0x47, 0x2b, 0xd5, 0x8a, 0xf5, 0xa2, 0x31, 0x38, 0xcc, 0xf6, - 0x4e, 0xca, 0x0c, 0xb5, 0x45, 0xee, 0xc6, 0xe9, 0x80, 0xfe, 0x30, 0x2c, 0x3f, 0x6b, 0x3b, 0x74, - 0xa3, 0xd3, 0x73, 0x77, 0xf1, 0x31, 0x28, 0x99, 0xec, 0x83, 0xeb, 0x70, 0xc0, 0x88, 0x09, 0xfd, - 0xdb, 0x08, 0x1e, 0x1e, 0xa7, 0xf5, 0x5d, 0x3b, 0xea, 0xb0, 0xf5, 0xe1, 0x38, 0xf5, 0xcd, 0x0e, - 0x35, 0x77, 0xc3, 0x5e, 0x57, 0xba, 0xac, 0xa4, 0x67, 0x53, 0x5f, 0xff, 0x29, 0x82, 0xfa, 0x44, - 0x4c, 0x77, 0x03, 0xe2, 0xfb, 0x34, 0xc0, 0xcf, 0x42, 0xe9, 0x1e, 0xfb, 0x81, 0x1f, 0xd0, 0x4a, - 0xab, 0xd1, 0x50, 0x03, 0xfc, 0x44, 0x2e, 0xcf, 0xfd, 0x9f, 0x11, 0x2f, 0xc7, 0x0d, 0x69, 0x9e, - 0x02, 0xe7, 0x73, 0x22, 0xc3, 0x27, 0xb1, 0x22, 0x9b, 0xcf, 0xa7, 0x3d, 0xb3, 0x08, 0x0b, 0x3e, - 0x09, 0x22, 0xfd, 0x38, 0x3c, 0x90, 0x3d, 0x1e, 0xbe, 0xe7, 0x86, 0x54, 0xff, 0x4d, 0xd6, 0x9b, - 0x36, 0x02, 0x4a, 0x22, 0x6a, 0xd0, 0x7b, 0x3d, 0x1a, 0x46, 0x78, 0x17, 0xd4, 0x9c, 0xc3, 0xad, - 0x5a, 0x69, 0x6d, 0x36, 0xd2, 0xa0, 0xdd, 0x90, 0x41, 0x9b, 0x7f, 0x7c, 0xc9, 0xb4, 0x1a, 0xfd, - 0x47, 0x1b, 0xfe, 0x6e, 0xbb, 0xc1, 0x52, 0x40, 0x06, 0x99, 0x4c, 0x01, 0xaa, 0xaa, 0x86, 0xca, - 0x1d, 0x9f, 0x80, 0xc5, 0x9e, 0x1f, 0xd2, 0x20, 0xe2, 0x9a, 0x95, 0x0d, 0x41, 0xb1, 0xfd, 0xeb, - 0x13, 0xc7, 0xb6, 0x48, 0x14, 0xef, 0x4f, 0xd9, 0x48, 0x68, 0xfd, 0xb7, 0x59, 0xf4, 0x2f, 0xf8, - 0xd6, 0xc7, 0x85, 0x5e, 0x45, 0x59, 0xc8, 0xa2, 0x54, 0x3d, 0xa8, 0x98, 0xf5, 0xa0, 0x5f, 0x66, - 0xf1, 0x5f, 0xa3, 0x0e, 0x4d, 0xf1, 0x8f, 0x72, 0x66, 0x0d, 0x96, 0x4c, 0x12, 0x9a, 0xc4, 0x92, - 0x52, 0x24, 0xc9, 0x02, 0x99, 0x1f, 0x78, 0x3e, 0x69, 0x73, 0x4e, 0xb7, 0x3d, 0xc7, 0x36, 0xf7, - 0x84, 0xb8, 0xe1, 0x1f, 0x86, 0x1c, 0x7f, 0x21, 0xdf, 0xf1, 0x4b, 0x59, 0xd8, 0xa7, 0xa1, 0xb2, - 0xbd, 0xe7, 0x9a, 0xcf, 0xfb, 0xf1, 0xe1, 0x3e, 0x06, 0x25, 0x3b, 0xa2, 0xdd, 0x50, 0x43, 0xfc, - 0x60, 0xc7, 0x84, 0xfe, 0xaf, 0x12, 0x9c, 0x50, 0x74, 0x63, 0x0b, 0xf2, 0x34, 0xcb, 0x8b, 0x52, - 0x27, 0x60, 0xd1, 0x0a, 0xf6, 0x8c, 0x9e, 0x2b, 0x1c, 0x40, 0x50, 0x4c, 0xb0, 0x1f, 0xf4, 0xdc, - 0x18, 0x7e, 0xd9, 0x88, 0x09, 0xbc, 0x03, 0xe5, 0x30, 0x62, 0xb7, 0x8c, 0xf6, 0x1e, 0x07, 0x5e, - 0x69, 0x7d, 0x76, 0xb6, 0x4d, 0x67, 0xd0, 0xb7, 0x05, 0x47, 0x23, 0xe1, 0x8d, 0xef, 0xb1, 0x98, - 0x16, 0x07, 0xba, 0x50, 0x5b, 0xaa, 0x15, 0xeb, 0x95, 0xd6, 0xf6, 0xec, 0x82, 0x9e, 0xf7, 0xd9, - 0x0d, 0x49, 0xc9, 0x60, 0x46, 0x2a, 0x85, 0x85, 0xd1, 0xae, 0x88, 0x0f, 0xa1, 0xb8, 0x0d, 0xa4, - 0x03, 0xf8, 0x0b, 0x50, 0xb2, 0xdd, 0x1d, 0x2f, 0xd4, 0x96, 0x39, 0x98, 0x67, 0x66, 0x03, 0xb3, - 0xe9, 0xee, 0x78, 0x46, 0xcc, 0x10, 0xdf, 0x83, 0x83, 0x01, 0x8d, 0x82, 0x3d, 0x69, 0x05, 0x0d, - 0xb8, 0x5d, 0x3f, 0x37, 0x9b, 0x04, 0x43, 0x65, 0x69, 0x64, 0x25, 0xe0, 0x75, 0xa8, 0x84, 0xa9, - 0x8f, 0x69, 0x15, 0x2e, 0x50, 0xcb, 0x30, 0x52, 0x7c, 0xd0, 0x50, 0x27, 0x0f, 0x79, 0xf7, 0x81, - 0x7c, 0xef, 0x3e, 0x38, 0x31, 0xab, 0x1d, 0x9a, 0x22, 0xab, 0x1d, 0x1e, 0xcc, 0x6a, 0x1f, 0x22, - 0x58, 0x19, 0x0a, 0x4e, 0xdb, 0x3e, 0xcd, 0x3d, 0x06, 0x04, 0x16, 0x42, 0x9f, 0x9a, 0x3c, 0x53, - 0x55, 0x5a, 0x37, 0xe7, 0x16, 0xad, 0xb8, 0x5c, 0xce, 0x3a, 0x2f, 0xa0, 0xce, 0x18, 0x17, 0x7e, - 0x84, 0xe0, 0xff, 0x15, 0x99, 0xb7, 0x49, 0x64, 0x76, 0xf2, 0x94, 0x65, 0xe7, 0x97, 0xcd, 0x11, - 0x79, 0x39, 0x26, 0x98, 0x55, 0xf9, 0xc7, 0x9d, 0x3d, 0x9f, 0x01, 0x64, 0xbf, 0xa4, 0x03, 0x33, - 0x5e, 0x9e, 0x7e, 0x86, 0xa0, 0xaa, 0xc6, 0x70, 0xcf, 0x71, 0x5e, 0x26, 0xe6, 0x6e, 0x1e, 0xc8, - 0x43, 0x50, 0xb0, 0x2d, 0x8e, 0xb0, 0x68, 0x14, 0x6c, 0x6b, 0x9f, 0xc1, 0x68, 0x10, 0xee, 0x62, - 0x3e, 0xdc, 0xa5, 0x2c, 0xdc, 0x8f, 0x06, 0xe0, 0xca, 0x90, 0x90, 0x03, 0x77, 0x05, 0x96, 0xdd, - 0x81, 0x8b, 0x6c, 0x3a, 0x30, 0xe2, 0x02, 0x5b, 0x18, 0xba, 0xc0, 0x6a, 0xb0, 0xd4, 0x4f, 0x9e, - 0x39, 0xec, 0x67, 0x49, 0x32, 0x15, 0xdb, 0x81, 0xd7, 0xf3, 0x85, 0xd1, 0x63, 0x82, 0xa1, 0xd8, - 0xb5, 0x5d, 0x76, 0x25, 0xe7, 0x28, 0xd8, 0xf7, 0xfe, 0x1f, 0x36, 0x19, 0xb5, 0x7f, 0x5e, 0x80, - 0x4f, 0x8c, 0x50, 0x7b, 0xa2, 0x3f, 0xdd, 0x1f, 0xba, 0x27, 0x5e, 0xbd, 0x34, 0xd6, 0xab, 0xcb, - 0x93, 0xbc, 0x7a, 0x39, 0xdf, 0x5e, 0x90, 0xb5, 0xd7, 0x4f, 0x0a, 0x50, 0x1b, 0x61, 0xaf, 0xc9, - 0xd7, 0x89, 0xfb, 0xc6, 0x60, 0x3b, 0x5e, 0x20, 0xbc, 0xa4, 0x6c, 0xc4, 0x04, 0x3b, 0x67, 0x5e, - 0xe0, 0x77, 0x88, 0xcb, 0xbd, 0xa3, 0x6c, 0x08, 0x6a, 0x46, 0x53, 0x5d, 0x03, 0x4d, 0x9a, 0xe7, - 0xaa, 0x19, 0x07, 0xa9, 0x80, 0x74, 0x69, 0x44, 0x83, 0x70, 0x5c, 0x88, 0xea, 0x13, 0xa7, 0x47, - 0x65, 0x88, 0xe2, 0x84, 0xfe, 0x66, 0x61, 0x90, 0x8d, 0xd1, 0x73, 0xef, 0x7f, 0x43, 0x9f, 0x80, - 0x45, 0xc2, 0xd1, 0x0a, 0xd7, 0x14, 0xd4, 0x90, 0x49, 0xcb, 0xf9, 0x26, 0x5d, 0xce, 0x98, 0x74, - 0xbd, 0xa0, 0x21, 0xfd, 0xc3, 0x02, 0x54, 0xc7, 0x19, 0xe4, 0xc5, 0xd6, 0xff, 0x9a, 0x49, 0x30, - 0x01, 0x2d, 0x18, 0xe3, 0x65, 0x1a, 0xf0, 0xcb, 0xd9, 0xd9, 0x4c, 0xc6, 0x1e, 0xe7, 0x92, 0xc6, - 0x58, 0x36, 0xfa, 0x37, 0x10, 0x9c, 0xcc, 0x2e, 0x0b, 0xb7, 0xec, 0x30, 0x92, 0x0f, 0x3b, 0xbc, - 0x03, 0x4b, 0xb1, 0x2a, 0xf1, 0xb5, 0xbc, 0xd2, 0xda, 0x9a, 0xf5, 0xb2, 0x96, 0xd9, 0x5d, 0xc9, - 0x5c, 0x7f, 0x1c, 0x4e, 0x8e, 0xcc, 0x50, 0x02, 0x46, 0x15, 0xca, 0xf2, 0x82, 0x2a, 0x76, 0x3f, - 0xa1, 0xf5, 0x77, 0x16, 0xb2, 0xd7, 0x05, 0xcf, 0xda, 0xf2, 0xda, 0x39, 0xb5, 0x9a, 0x7c, 0x8f, - 0x61, 0xbb, 0xe1, 0x59, 0x4a, 0x59, 0x46, 0x92, 0x6c, 0x9d, 0xe9, 0xb9, 0x11, 0xb1, 0x5d, 0x1a, - 0x88, 0x1b, 0x4d, 0x3a, 0xc0, 0x76, 0x3a, 0xb4, 0x5d, 0x93, 0x6e, 0x53, 0xd3, 0x73, 0xad, 0x90, - 0xbb, 0x4c, 0xd1, 0xc8, 0x8c, 0xe1, 0xe7, 0x60, 0x99, 0xd3, 0x77, 0xec, 0x6e, 0x9c, 0xc2, 0x2b, - 0xad, 0xd5, 0x46, 0x5c, 0x3f, 0x6d, 0xa8, 0xf5, 0xd3, 0xd4, 0x86, 0x5d, 0x1a, 0x91, 0x46, 0xff, - 0x72, 0x83, 0xad, 0x30, 0xd2, 0xc5, 0x0c, 0x4b, 0x44, 0x6c, 0x67, 0xcb, 0x76, 0xf9, 0xa3, 0x81, - 0x89, 0x4a, 0x07, 0x98, 0x37, 0xee, 0x78, 0x8e, 0xe3, 0xbd, 0x22, 0x63, 0x5e, 0x4c, 0xb1, 0x55, - 0x3d, 0x37, 0xb2, 0x1d, 0x2e, 0x3f, 0xf6, 0xb5, 0x74, 0x80, 0xaf, 0xb2, 0x9d, 0x88, 0x06, 0x22, - 0xd8, 0x09, 0x2a, 0xf1, 0xf7, 0x4a, 0x5c, 0x12, 0x94, 0xb1, 0x36, 0x3e, 0x19, 0x07, 0xd4, 0x93, - 0x31, 0x78, 0xda, 0x0e, 0x8e, 0xa8, 0x6b, 0xf1, 0x0a, 0x29, 0xed, 0xdb, 0x5e, 0x8f, 0xdd, 0x87, - 0xf9, 0xb5, 0x51, 0xd2, 0x43, 0xa7, 0xe5, 0x70, 0xfe, 0x69, 0x39, 0x92, 0x3d, 0x2d, 0xfc, 0x55, - 0x13, 0x99, 0x9d, 0x0d, 0x12, 0x52, 0xed, 0x28, 0x67, 0x9d, 0x0e, 0xe8, 0xbf, 0x43, 0x50, 0xde, - 0xf2, 0xda, 0xd7, 0xdd, 0x28, 0xd8, 0xe3, 0xef, 0x5f, 0xcf, 0x8d, 0xa8, 0x2b, 0xbd, 0x49, 0x92, - 0x6c, 0x8b, 0x22, 0xbb, 0x4b, 0xb7, 0x23, 0xd2, 0xf5, 0xc5, 0xed, 0x79, 0x5f, 0x5b, 0x94, 0x2c, - 0x66, 0x66, 0x73, 0x48, 0x18, 0xf1, 0x90, 0x53, 0x36, 0xf8, 0x37, 0x53, 0x30, 0x99, 0xb0, 0x1d, - 0x05, 0x22, 0xde, 0x64, 0xc6, 0x54, 0x07, 0x2c, 0xc5, 0xd8, 0x04, 0xa9, 0x77, 0xe1, 0xc1, 0xe4, - 0x59, 0x77, 0x87, 0x06, 0x5d, 0xdb, 0x25, 0xf9, 0x79, 0x79, 0x8a, 0xc2, 0x6d, 0x4e, 0x55, 0xc1, - 0xcb, 0x1c, 0x49, 0xf6, 0x4a, 0xba, 0x6b, 0xbb, 0x96, 0xf7, 0x4a, 0xce, 0xd1, 0x9a, 0x4d, 0xe0, - 0x5f, 0xb2, 0xb5, 0x57, 0x45, 0x62, 0x12, 0x07, 0x9e, 0x83, 0x83, 0x2c, 0x62, 0xf4, 0xa9, 0xf8, - 0x41, 0x04, 0x25, 0x7d, 0x5c, 0x19, 0x2c, 0xe5, 0x61, 0x64, 0x17, 0xe2, 0x2d, 0x38, 0x4c, 0xc2, - 0xd0, 0x6e, 0xbb, 0xd4, 0x92, 0xbc, 0x0a, 0x53, 0xf3, 0x1a, 0x5c, 0x1a, 0x17, 0x54, 0xf8, 0x0c, - 0xb1, 0xdf, 0x92, 0xd4, 0xbf, 0x8e, 0xe0, 0xf8, 0x48, 0x26, 0xc9, 0xb9, 0x42, 0x4a, 0x1e, 0xa9, - 0x42, 0x39, 0x34, 0x3b, 0xd4, 0xea, 0x39, 0xf2, 0xaa, 0x90, 0xd0, 0xec, 0x37, 0xab, 0x17, 0xef, - 0xbe, 0xc8, 0x63, 0x09, 0x8d, 0x4f, 0x01, 0x74, 0x89, 0xdb, 0x23, 0x0e, 0x87, 0xb0, 0xc0, 0x21, - 0x28, 0x23, 0xfa, 0x0a, 0x54, 0x47, 0xb9, 0x8e, 0xa8, 0xde, 0xfd, 0x13, 0xc1, 0x21, 0x19, 0x72, - 0xc5, 0xee, 0xd6, 0xe1, 0xb0, 0x62, 0x86, 0x5b, 0xe9, 0x46, 0x0f, 0x0e, 0x4f, 0x08, 0xa7, 0xd2, - 0x4b, 0x8a, 0xd9, 0xf6, 0x49, 0x3f, 0xd3, 0x00, 0x99, 0x3a, 0xe1, 0xa2, 0x39, 0xbd, 0x0c, 0xbe, - 0x06, 0xda, 0x4d, 0xe2, 0x92, 0x36, 0xb5, 0x12, 0xb5, 0x13, 0x17, 0xfb, 0xb2, 0x5a, 0x86, 0x9a, - 0xb9, 0xe8, 0x93, 0x5c, 0xa2, 0xed, 0x9d, 0x1d, 0x59, 0xd2, 0x0a, 0xa0, 0xbc, 0x65, 0xbb, 0xbb, - 0x9b, 0xee, 0x8e, 0xc7, 0x34, 0x8e, 0xec, 0xc8, 0x91, 0xd6, 0x8d, 0x09, 0x7c, 0x04, 0x8a, 0xbd, - 0xc0, 0x11, 0x1e, 0xc0, 0x3e, 0x71, 0x0d, 0x2a, 0x16, 0x0d, 0xcd, 0xc0, 0xf6, 0xc5, 0xfe, 0xf3, - 0x76, 0x80, 0x32, 0xc4, 0xf6, 0xc1, 0x36, 0x3d, 0x77, 0xc3, 0x21, 0x61, 0x28, 0xd3, 0x53, 0x32, - 0xa0, 0x3f, 0x09, 0x07, 0x99, 0xcc, 0x54, 0xcd, 0x0b, 0x59, 0x35, 0x8f, 0x67, 0xe0, 0x4b, 0x78, - 0x12, 0x31, 0x81, 0x07, 0xd8, 0xad, 0xe0, 0xaa, 0xef, 0x0b, 0x26, 0x53, 0x5e, 0x51, 0x8b, 0xa3, - 0xb2, 0xeb, 0xc8, 0x2a, 0x78, 0xeb, 0xbd, 0x73, 0x80, 0xd5, 0x73, 0x42, 0x83, 0xbe, 0x6d, 0x52, - 0xfc, 0x1d, 0x04, 0x0b, 0x4c, 0x34, 0x7e, 0x68, 0xdc, 0xb1, 0xe4, 0xfe, 0x5a, 0x9d, 0x5f, 0x89, - 0x83, 0x49, 0xd3, 0x57, 0x5e, 0xff, 0xeb, 0xdf, 0xbf, 0x5b, 0x38, 0x81, 0x8f, 0xf1, 0xde, 0x67, - 0xff, 0xb2, 0xda, 0x87, 0x0c, 0xf1, 0x1b, 0x08, 0xb0, 0xb8, 0x25, 0x29, 0xdd, 0x21, 0x7c, 0x61, - 0x1c, 0xc4, 0x11, 0x5d, 0xa4, 0xea, 0x43, 0x4a, 0x56, 0x69, 0x98, 0x5e, 0x40, 0x59, 0x0e, 0xe1, - 0x13, 0x38, 0x80, 0x55, 0x0e, 0xe0, 0x0c, 0xd6, 0x47, 0x01, 0x68, 0xbe, 0xca, 0x2c, 0xfa, 0x5a, - 0x93, 0xc6, 0x72, 0xdf, 0x46, 0x50, 0xba, 0xcb, 0x5f, 0x87, 0x13, 0x8c, 0xb4, 0x3d, 0x37, 0x23, - 0x71, 0x71, 0x1c, 0xad, 0x7e, 0x9a, 0x23, 0x7d, 0x08, 0x9f, 0x94, 0x48, 0xc3, 0x28, 0xa0, 0xa4, - 0x9b, 0x01, 0x7c, 0x09, 0xe1, 0x77, 0x11, 0x2c, 0xc6, 0x6d, 0x01, 0x7c, 0x76, 0x1c, 0xca, 0x4c, - 0xdb, 0xa0, 0x3a, 0xbf, 0x1a, 0xbb, 0xfe, 0x08, 0xc7, 0x78, 0x5a, 0x1f, 0xb9, 0x9d, 0xeb, 0x99, - 0x0a, 0xfc, 0x5b, 0x08, 0x8a, 0x37, 0xe8, 0x44, 0x7f, 0x9b, 0x23, 0xb8, 0x21, 0x03, 0x8e, 0xd8, - 0x6a, 0xfc, 0x0e, 0x82, 0x07, 0x6f, 0xd0, 0x68, 0x74, 0x7a, 0xc4, 0xf5, 0xc9, 0x39, 0x4b, 0xb8, - 0xdd, 0x85, 0x29, 0x66, 0x26, 0x79, 0xa1, 0xc9, 0x91, 0x3d, 0x82, 0xcf, 0xe7, 0x39, 0x61, 0xb8, - 0xe7, 0x9a, 0xaf, 0x08, 0x1c, 0x7f, 0x42, 0x70, 0x64, 0xb0, 0x0b, 0x8c, 0xf5, 0x81, 0x37, 0xca, - 0x88, 0x26, 0x71, 0xf5, 0xd6, 0xac, 0x51, 0x36, 0xcb, 0x54, 0xbf, 0xca, 0x91, 0x3f, 0x81, 0x1f, - 0xcf, 0x43, 0x9e, 0xd4, 0x58, 0x9b, 0xaf, 0xca, 0xcf, 0xd7, 0xf8, 0x3f, 0x16, 0x38, 0xec, 0x3f, - 0x23, 0x38, 0x26, 0xf9, 0x6e, 0x74, 0x48, 0x10, 0x5d, 0xa3, 0xec, 0x86, 0x1d, 0x4e, 0xa5, 0xcf, - 0x8c, 0x59, 0x43, 0x95, 0xa7, 0x5f, 0xe7, 0xba, 0x3c, 0x8d, 0x9f, 0xda, 0xb7, 0x2e, 0x26, 0x63, - 0x63, 0x09, 0xd8, 0xef, 0x21, 0x38, 0x74, 0x83, 0x46, 0xcf, 0x6f, 0x6c, 0xee, 0x6b, 0x67, 0x66, - 0x74, 0x74, 0x45, 0x9c, 0x7e, 0x8d, 0x2b, 0xf2, 0x69, 0xfc, 0xe4, 0xbe, 0x15, 0xf1, 0x4c, 0x3b, - 0xd9, 0x97, 0xd7, 0x11, 0x1c, 0xb8, 0x41, 0xa3, 0x9b, 0x49, 0xbf, 0xe2, 0xec, 0x54, 0x3d, 0xd0, - 0xea, 0x4a, 0x43, 0xf9, 0xc3, 0x87, 0xfc, 0x29, 0x71, 0xf5, 0x35, 0x8e, 0xed, 0x3c, 0x3e, 0x9b, - 0x87, 0x2d, 0xed, 0x91, 0xbc, 0x8d, 0xe0, 0xb8, 0x0a, 0x22, 0xed, 0x1d, 0x7f, 0x72, 0x7f, 0x1d, - 0x59, 0xd1, 0xd7, 0x9d, 0x80, 0xae, 0xc5, 0xd1, 0x5d, 0xd4, 0x47, 0x1f, 0xc4, 0xee, 0x10, 0x8a, - 0x75, 0xb4, 0x5a, 0x47, 0xf8, 0xf7, 0x08, 0x16, 0xe3, 0x76, 0xc1, 0x78, 0x1b, 0x65, 0x7a, 0x9d, - 0xf3, 0x8c, 0x6a, 0xc2, 0x6b, 0xab, 0x97, 0x46, 0x1b, 0x54, 0x5d, 0x2f, 0xb7, 0xb6, 0xc1, 0xad, - 0x9c, 0x0d, 0xc7, 0xbf, 0x42, 0x00, 0x69, 0xcb, 0x03, 0x3f, 0x92, 0xaf, 0x87, 0xd2, 0x16, 0xa9, - 0xce, 0xb7, 0xe9, 0xa1, 0x37, 0xb8, 0x3e, 0xf5, 0x6a, 0x2d, 0x37, 0x16, 0xfa, 0xd4, 0x5c, 0x8f, - 0xdb, 0x23, 0x3f, 0x46, 0x50, 0xe2, 0x95, 0x66, 0x7c, 0x66, 0x1c, 0x66, 0xb5, 0x10, 0x3d, 0x4f, - 0xd3, 0x9f, 0xe3, 0x50, 0x6b, 0xad, 0xbc, 0x84, 0xb2, 0x8e, 0x56, 0x71, 0x1f, 0x16, 0xe3, 0xda, - 0xee, 0x78, 0xf7, 0xc8, 0xd4, 0x7e, 0xab, 0xb5, 0x9c, 0x0b, 0x4e, 0xec, 0xa8, 0x22, 0x97, 0xad, - 0x4e, 0xca, 0x65, 0x0b, 0x2c, 0xdd, 0xe0, 0xd3, 0x79, 0xc9, 0xe8, 0xbf, 0x60, 0x98, 0x0b, 0x1c, - 0xdd, 0x59, 0xbd, 0x36, 0x29, 0x9f, 0x31, 0xeb, 0x7c, 0x0f, 0xc1, 0x91, 0xc1, 0x47, 0x02, 0x3e, - 0x39, 0xb2, 0xde, 0x26, 0x72, 0x6b, 0xd6, 0x8a, 0xe3, 0x1e, 0x18, 0xfa, 0x67, 0x38, 0x8a, 0x75, - 0xfc, 0xd8, 0xc4, 0x93, 0x71, 0x4b, 0x46, 0x1d, 0xc6, 0x68, 0x2d, 0xed, 0xdf, 0xfe, 0x1a, 0xc1, - 0x01, 0xc9, 0xf7, 0x4e, 0x40, 0x69, 0x3e, 0xac, 0xf9, 0x1d, 0x04, 0x26, 0x4b, 0x7f, 0x92, 0xc3, - 0xff, 0x14, 0xbe, 0x32, 0x25, 0x7c, 0x09, 0x7b, 0x2d, 0x62, 0x48, 0xff, 0x80, 0xe0, 0xe8, 0xdd, - 0xd8, 0xef, 0x3f, 0x26, 0xfc, 0x1b, 0x1c, 0xff, 0x53, 0xf8, 0x89, 0x9c, 0xfb, 0xea, 0x24, 0x35, - 0x2e, 0x21, 0xfc, 0x0b, 0x04, 0x65, 0xd9, 0xf7, 0xc3, 0xe7, 0xc7, 0x1e, 0x8c, 0x6c, 0x67, 0x70, - 0x9e, 0xce, 0x2c, 0x2e, 0x67, 0xfa, 0x99, 0xdc, 0x6c, 0x2a, 0xe4, 0x33, 0x87, 0x7e, 0x0b, 0x01, - 0x4e, 0xde, 0xfe, 0x49, 0x35, 0x00, 0x9f, 0xcb, 0x88, 0x1a, 0x5b, 0x60, 0xaa, 0x9e, 0x9f, 0x38, - 0x2f, 0x9b, 0x4a, 0x57, 0x73, 0x53, 0xa9, 0x97, 0xc8, 0x7f, 0x13, 0x41, 0xe5, 0x06, 0x4d, 0xde, - 0x52, 0x39, 0xb6, 0xcc, 0xb6, 0x2d, 0xab, 0xf5, 0xc9, 0x13, 0x05, 0xa2, 0x8b, 0x1c, 0xd1, 0x39, - 0x9c, 0x6f, 0x2a, 0x09, 0xe0, 0xfb, 0x08, 0x0e, 0xde, 0x56, 0x5d, 0x14, 0x5f, 0x9c, 0x24, 0x29, - 0x13, 0xc9, 0xa7, 0xc7, 0xf5, 0x28, 0xc7, 0xb5, 0xa6, 0x4f, 0x85, 0x6b, 0x5d, 0x74, 0x00, 0x7f, - 0x88, 0xe2, 0xc7, 0xf8, 0x40, 0xd5, 0xfe, 0x3f, 0xb5, 0x5b, 0x4e, 0xf1, 0x5f, 0xbf, 0xc2, 0xf1, - 0x35, 0xf0, 0xc5, 0x69, 0xf0, 0x35, 0x45, 0x29, 0x1f, 0xff, 0x00, 0xc1, 0x51, 0xde, 0xb6, 0x51, - 0x19, 0xe3, 0xbc, 0x4e, 0x45, 0xda, 0xe4, 0x99, 0x22, 0xc5, 0x3c, 0x1d, 0xc7, 0x1f, 0x7d, 0x5f, - 0xa0, 0xd6, 0x45, 0x43, 0xe6, 0x9b, 0x05, 0xc4, 0xf6, 0xf7, 0x81, 0x21, 0x7c, 0x2f, 0xb6, 0x06, - 0x0c, 0x38, 0xbe, 0x0d, 0x35, 0x05, 0xc6, 0x75, 0x8e, 0xf1, 0x8a, 0xde, 0xdc, 0x0f, 0xc6, 0x66, - 0xbf, 0xc5, 0x8e, 0xe9, 0xb7, 0x10, 0x1c, 0x92, 0x69, 0x57, 0xf8, 0xdf, 0xda, 0xa4, 0xad, 0xdd, - 0x6f, 0x9a, 0x16, 0x07, 0x62, 0x75, 0xba, 0x03, 0xf1, 0x2e, 0x82, 0x25, 0xd1, 0x55, 0xc9, 0xb9, - 0xcc, 0x28, 0x6d, 0x97, 0xea, 0x40, 0x35, 0x49, 0x94, 0xdd, 0xf5, 0x2f, 0x72, 0xb1, 0x2f, 0xe0, - 0x5c, 0xb3, 0xf8, 0x9e, 0x15, 0x36, 0x5f, 0x15, 0x35, 0xef, 0xd7, 0x9a, 0x8e, 0xd7, 0x0e, 0x5f, - 0xd2, 0x71, 0x6e, 0xca, 0x66, 0x73, 0x2e, 0x21, 0x1c, 0xc1, 0x32, 0x73, 0x5f, 0x5e, 0xa2, 0xc2, - 0xb5, 0x81, 0x82, 0xd6, 0x50, 0xf5, 0xaa, 0x5a, 0x1d, 0x2a, 0x79, 0xa5, 0x39, 0x5a, 0x14, 0x0c, - 0xf0, 0xc3, 0xb9, 0x62, 0xb9, 0xa0, 0x37, 0x10, 0x1c, 0x55, 0xcf, 0x63, 0x2c, 0x7e, 0xea, 0xd3, - 0x98, 0x87, 0x42, 0x5c, 0xfb, 0xf1, 0xea, 0x54, 0x6e, 0xc4, 0xe1, 0x3c, 0xf3, 0xec, 0x1f, 0x3f, - 0x38, 0x85, 0xde, 0xff, 0xe0, 0x14, 0xfa, 0xdb, 0x07, 0xa7, 0xd0, 0x4b, 0x8f, 0x4d, 0xf7, 0x3f, - 0x7b, 0xd3, 0xb1, 0xa9, 0x1b, 0xa9, 0xec, 0xff, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x81, 0x66, 0x91, - 0xb9, 0x4d, 0x30, 0x00, 0x00, + // 3072 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5b, 0xcd, 0x8f, 0x1c, 0x47, + 0x15, 0xa7, 0x66, 0x76, 0x76, 0x67, 0xdf, 0xd8, 0x5e, 0xbb, 0x62, 0x2f, 0x9d, 0xf1, 0xc6, 0x6c, + 0xca, 0x5f, 0x93, 0xb5, 0x77, 0xc6, 0x9e, 0x18, 0x94, 0x6c, 0x12, 0x82, 0xb3, 0x76, 0x9c, 0x25, + 0x6b, 0xc7, 0xf4, 0x3a, 0x36, 0x0a, 0x07, 0xd2, 0xe9, 0xa9, 0x9d, 0x69, 0x76, 0xa6, 0xbb, 0x5d, + 0xdd, 0x33, 0x66, 0x15, 0x72, 0x09, 0x42, 0x42, 0x22, 0x0a, 0x02, 0x72, 0xe0, 0xc0, 0x97, 0x12, + 0x45, 0x42, 0x08, 0xc4, 0x05, 0x21, 0x24, 0x84, 0x04, 0x87, 0x20, 0x38, 0x44, 0x8a, 0xe0, 0x1f, + 0x40, 0x11, 0xe2, 0x48, 0x2e, 0x39, 0x23, 0x54, 0xd5, 0x55, 0xdd, 0xd5, 0xf3, 0xd1, 0x33, 0xcb, + 0x2c, 0x24, 0x12, 0xa7, 0xed, 0x57, 0x5d, 0xfd, 0xea, 0xf7, 0x5e, 0xbd, 0x7a, 0xef, 0xd5, 0x7b, + 0xb3, 0x70, 0x2a, 0xa0, 0xac, 0x47, 0x59, 0xcd, 0xf2, 0xfd, 0xb6, 0x63, 0x5b, 0xa1, 0xe3, 0xb9, + 0xfa, 0x73, 0xd5, 0x67, 0x5e, 0xe8, 0xe1, 0x92, 0x36, 0x54, 0x5e, 0x6a, 0x7a, 0x5e, 0xb3, 0x4d, + 0x6b, 0x96, 0xef, 0xd4, 0x2c, 0xd7, 0xf5, 0x42, 0x31, 0x1c, 0x44, 0x53, 0xcb, 0x64, 0xe7, 0x91, + 0xa0, 0xea, 0x78, 0xe2, 0xad, 0xed, 0x31, 0x5a, 0xeb, 0x5d, 0xac, 0x35, 0xa9, 0x4b, 0x99, 0x15, + 0xd2, 0x86, 0x9c, 0x73, 0x29, 0x99, 0xd3, 0xb1, 0xec, 0x96, 0xe3, 0x52, 0xb6, 0x5b, 0xf3, 0x77, + 0x9a, 0x7c, 0x20, 0xa8, 0x75, 0x68, 0x68, 0x0d, 0xfb, 0x6a, 0xb3, 0xe9, 0x84, 0xad, 0xee, 0x4b, + 0x55, 0xdb, 0xeb, 0xd4, 0x2c, 0xd6, 0xf4, 0x7c, 0xe6, 0x7d, 0x45, 0x3c, 0xac, 0xda, 0x8d, 0x5a, + 0xef, 0xe1, 0x84, 0x81, 0x2e, 0x4b, 0xef, 0xa2, 0xd5, 0xf6, 0x5b, 0xd6, 0x20, 0xb7, 0xab, 0x63, + 0xb8, 0x31, 0xea, 0x7b, 0x52, 0x37, 0xe2, 0xd1, 0x09, 0x3d, 0xb6, 0xab, 0x3d, 0x46, 0x6c, 0xc8, + 0x87, 0x08, 0x0e, 0x5f, 0x4e, 0xd6, 0xfb, 0x42, 0x97, 0xb2, 0x5d, 0x8c, 0x61, 0xc6, 0xb5, 0x3a, + 0xd4, 0x40, 0xcb, 0xa8, 0x32, 0x6f, 0x8a, 0x67, 0x6c, 0xc0, 0x1c, 0xa3, 0xdb, 0x8c, 0x06, 0x2d, + 0x23, 0x27, 0x86, 0x15, 0x89, 0xcb, 0x50, 0xe4, 0x8b, 0x53, 0x3b, 0x0c, 0x8c, 0xfc, 0x72, 0xbe, + 0x32, 0x6f, 0xc6, 0x34, 0xae, 0xc0, 0x02, 0xa3, 0x81, 0xd7, 0x65, 0x36, 0xbd, 0x4d, 0x59, 0xe0, + 0x78, 0xae, 0x31, 0x23, 0xbe, 0xee, 0x1f, 0xe6, 0x5c, 0x02, 0xda, 0xa6, 0x76, 0xe8, 0x31, 0xa3, + 0x20, 0xa6, 0xc4, 0x34, 0xc7, 0xc3, 0x81, 0x1b, 0xb3, 0x11, 0x1e, 0xfe, 0x8c, 0x09, 0x1c, 0xb0, + 0x7c, 0xff, 0x86, 0xd5, 0xa1, 0x81, 0x6f, 0xd9, 0xd4, 0x98, 0x13, 0xef, 0x52, 0x63, 0x1c, 0xb3, + 0x44, 0x62, 0x14, 0x05, 0x30, 0x45, 0x92, 0x75, 0x98, 0xbf, 0xe1, 0x35, 0xe8, 0x68, 0x71, 0xfb, + 0xd9, 0xe7, 0x06, 0xd9, 0x93, 0x77, 0x10, 0x1c, 0x33, 0x69, 0xcf, 0xe1, 0xf8, 0xaf, 0xd3, 0xd0, + 0x6a, 0x58, 0xa1, 0xd5, 0xcf, 0x31, 0x17, 0x73, 0x2c, 0x43, 0x91, 0xc9, 0xc9, 0x46, 0x4e, 0x8c, + 0xc7, 0xf4, 0xc0, 0x6a, 0xf9, 0x6c, 0x61, 0x22, 0x15, 0x2a, 0x12, 0x2f, 0x43, 0x29, 0xd2, 0xe5, + 0x86, 0xdb, 0xa0, 0x5f, 0x15, 0xda, 0x2b, 0x98, 0xfa, 0x10, 0x5e, 0x82, 0xf9, 0x5e, 0xa4, 0xe7, + 0x8d, 0x86, 0xd0, 0x62, 0xc1, 0x4c, 0x06, 0xc8, 0x3f, 0x10, 0x9c, 0xd0, 0x6c, 0xc0, 0x94, 0x3b, + 0x73, 0xb5, 0x47, 0xdd, 0x30, 0x18, 0x2d, 0xd0, 0x79, 0x38, 0xa2, 0x36, 0xb1, 0x5f, 0x4f, 0x83, + 0x2f, 0xb8, 0x88, 0xfa, 0xa0, 0x12, 0x51, 0x1f, 0xe3, 0x82, 0x28, 0xfa, 0xf9, 0x8d, 0x2b, 0x52, + 0x4c, 0x7d, 0x68, 0x40, 0x51, 0x85, 0x6c, 0x45, 0xcd, 0xa6, 0x14, 0x45, 0xde, 0x43, 0x60, 0x68, + 0x82, 0x5e, 0xb7, 0x5c, 0x67, 0x9b, 0x06, 0xe1, 0xa4, 0x7b, 0x86, 0xf6, 0x71, 0xcf, 0x2a, 0xb0, + 0x10, 0x49, 0x75, 0x93, 0x9f, 0x47, 0xee, 0x7f, 0x8c, 0xc2, 0x72, 0xbe, 0x92, 0x37, 0xfb, 0x87, + 0xf9, 0xde, 0xa9, 0x35, 0x03, 0x63, 0x56, 0x98, 0x71, 0x32, 0x40, 0x1e, 0x84, 0xf9, 0xa7, 0x9d, + 0x36, 0x5d, 0x6f, 0x75, 0xdd, 0x1d, 0x7c, 0x14, 0x0a, 0x36, 0x7f, 0x10, 0x32, 0x1c, 0x30, 0x23, + 0x82, 0x7c, 0x07, 0xc1, 0x83, 0xa3, 0xa4, 0xbe, 0xe3, 0x84, 0x2d, 0xfe, 0x7d, 0x30, 0x4a, 0x7c, + 0xbb, 0x45, 0xed, 0x9d, 0xa0, 0xdb, 0x51, 0x26, 0xab, 0xe8, 0xe9, 0xc4, 0x27, 0x3f, 0x43, 0x50, + 0x19, 0x8b, 0xe9, 0x0e, 0xb3, 0x7c, 0x9f, 0x32, 0xfc, 0x34, 0x14, 0xee, 0xf2, 0x17, 0xe2, 0x80, + 0x96, 0xea, 0xd5, 0xaa, 0xee, 0xe0, 0xc7, 0x72, 0x79, 0xe6, 0x13, 0x66, 0xf4, 0x39, 0xae, 0x2a, + 0xf5, 0xe4, 0x04, 0x9f, 0xc5, 0x14, 0x9f, 0x58, 0x8b, 0x7c, 0xbe, 0x98, 0xf6, 0xd4, 0x2c, 0xcc, + 0xf8, 0x16, 0x0b, 0xc9, 0x31, 0xb8, 0x2f, 0x7d, 0x3c, 0x7c, 0xcf, 0x0d, 0x28, 0x79, 0x16, 0x8e, + 0x6b, 0xc3, 0xb7, 0xad, 0xb6, 0xd3, 0xb0, 0x42, 0xaa, 0x5e, 0xf3, 0xcd, 0xa0, 0x8c, 0x79, 0x4c, + 0xba, 0x95, 0x88, 0xc0, 0x8b, 0x30, 0x4b, 0xdd, 0xd0, 0x09, 0x77, 0xa5, 0x3d, 0x49, 0x8a, 0xbc, + 0x08, 0x44, 0x5f, 0xc3, 0x6b, 0xb7, 0xbd, 0x6e, 0xc8, 0xff, 0xbc, 0x64, 0xd9, 0x3b, 0x31, 0x4f, + 0xee, 0x84, 0xa3, 0x57, 0x72, 0x9f, 0x14, 0xc9, 0x8f, 0x8e, 0x4b, 0xef, 0x99, 0xba, 0x83, 0xc9, + 0x9b, 0xfa, 0x10, 0xf9, 0x6d, 0xda, 0xf8, 0xd7, 0x19, 0x15, 0x68, 0xef, 0x76, 0x69, 0x10, 0xe2, + 0x1d, 0xd0, 0x43, 0xa4, 0x60, 0x5e, 0xaa, 0x6f, 0x54, 0x93, 0x18, 0x53, 0x55, 0x31, 0x46, 0x3c, + 0x7c, 0xd9, 0x6e, 0x54, 0x7b, 0x0f, 0x57, 0xfd, 0x9d, 0x66, 0x95, 0x47, 0xac, 0x94, 0x22, 0x55, + 0xc4, 0xd2, 0x77, 0xc6, 0xd4, 0xb9, 0x73, 0x1d, 0x74, 0xfd, 0x80, 0xb2, 0x50, 0xe8, 0xa0, 0x68, + 0x4a, 0x8a, 0x9b, 0x5b, 0x4f, 0x6a, 0x51, 0x98, 0x53, 0xd1, 0x8c, 0x69, 0xf2, 0xbb, 0x34, 0xfa, + 0xe7, 0xfd, 0xc6, 0x47, 0x85, 0x5e, 0x47, 0x99, 0x4b, 0xa3, 0xd4, 0x0d, 0x3e, 0x9f, 0x36, 0xf8, + 0x5f, 0xa5, 0xf1, 0x5f, 0xa1, 0x6d, 0x9a, 0xe0, 0x1f, 0x76, 0xf6, 0x0c, 0x98, 0xb3, 0xad, 0xc0, + 0xb6, 0x1a, 0x6a, 0x15, 0x45, 0x72, 0xbf, 0xeb, 0x33, 0xcf, 0xb7, 0x9a, 0x82, 0xd3, 0x4d, 0xaf, + 0xed, 0xd8, 0xbb, 0x72, 0xb9, 0xc1, 0x17, 0x03, 0xe7, 0x74, 0x26, 0xfb, 0x9c, 0x16, 0xd2, 0xb0, + 0x4f, 0x42, 0x69, 0x6b, 0xd7, 0xb5, 0x9f, 0xf3, 0x23, 0x5f, 0x74, 0x14, 0x0a, 0x4e, 0x48, 0x3b, + 0x81, 0x81, 0x84, 0x1f, 0x8a, 0x08, 0xf2, 0xaf, 0x02, 0x2c, 0x6a, 0xb2, 0xf1, 0x0f, 0xb2, 0x24, + 0xcb, 0x72, 0xaa, 0x8b, 0x30, 0xdb, 0x60, 0xbb, 0x66, 0xd7, 0x95, 0x06, 0x20, 0x29, 0xbe, 0xb0, + 0xcf, 0xba, 0x6e, 0x04, 0xbf, 0x68, 0x46, 0x04, 0xde, 0x86, 0x62, 0x10, 0xf2, 0xa4, 0xa8, 0xb9, + 0x2b, 0x80, 0x97, 0xea, 0x9f, 0x9f, 0x6e, 0xd3, 0x39, 0xf4, 0x2d, 0xc9, 0xd1, 0x8c, 0x79, 0xe3, + 0xbb, 0xdc, 0x05, 0x47, 0x7e, 0x39, 0x30, 0xe6, 0x96, 0xf3, 0x95, 0x52, 0x7d, 0x6b, 0xfa, 0x85, + 0x9e, 0xf3, 0x79, 0x42, 0xa7, 0x05, 0x5c, 0x33, 0x59, 0x85, 0x7b, 0xfd, 0x8e, 0x74, 0x67, 0x81, + 0x4c, 0x5e, 0x92, 0x01, 0xfc, 0x45, 0x28, 0x38, 0xee, 0xb6, 0x17, 0x18, 0xf3, 0x02, 0xcc, 0x53, + 0xd3, 0x81, 0xd9, 0x70, 0xb7, 0x3d, 0x33, 0x62, 0x88, 0xef, 0xc2, 0x41, 0x46, 0x43, 0xb6, 0xab, + 0xb4, 0x60, 0x80, 0xd0, 0xeb, 0xb3, 0xd3, 0xad, 0x60, 0xea, 0x2c, 0xcd, 0xf4, 0x0a, 0x78, 0x0d, + 0x4a, 0x41, 0x62, 0x63, 0x46, 0x49, 0x2c, 0x68, 0xa4, 0x18, 0x69, 0x36, 0x68, 0xea, 0x93, 0x07, + 0xac, 0xfb, 0x40, 0xb6, 0x75, 0x1f, 0x1c, 0x1b, 0x84, 0x0f, 0x4d, 0x10, 0x84, 0x17, 0xfa, 0x83, + 0xf0, 0x07, 0x08, 0x96, 0x06, 0x9c, 0xd3, 0x96, 0x4f, 0x33, 0x8f, 0x81, 0x05, 0x33, 0x81, 0x4f, + 0x6d, 0xe1, 0xaa, 0x4b, 0xf5, 0xeb, 0xfb, 0xe6, 0xad, 0xc4, 0xba, 0x82, 0x75, 0x96, 0x43, 0x9d, + 0xd2, 0x2f, 0xfc, 0x18, 0xc1, 0x27, 0xb5, 0x35, 0x6f, 0x5a, 0xa1, 0xdd, 0xca, 0x12, 0x96, 0x9f, + 0x5f, 0x3e, 0x47, 0xa6, 0x11, 0x11, 0xc1, 0xb5, 0x2a, 0x1e, 0x6e, 0xed, 0xfa, 0x1c, 0x20, 0x7f, + 0x93, 0x0c, 0x4c, 0x99, 0xeb, 0x7d, 0x2b, 0xbd, 0x27, 0x32, 0x3c, 0x8b, 0xd3, 0xf6, 0xbf, 0x0f, + 0x1a, 0xe4, 0xdd, 0x74, 0x0e, 0x36, 0x10, 0xdf, 0x47, 0x6b, 0x6e, 0x09, 0xe6, 0x5d, 0x2d, 0xbb, + 0x16, 0x3a, 0x8a, 0x07, 0x44, 0xc6, 0x1c, 0xf1, 0x92, 0x49, 0x75, 0x4e, 0x64, 0xcc, 0xc9, 0x10, + 0x5e, 0x81, 0xc3, 0x1a, 0xa9, 0xf6, 0x9a, 0x4f, 0x1b, 0x18, 0x17, 0xb7, 0x35, 0x89, 0x4c, 0x39, + 0xe8, 0x82, 0x48, 0x24, 0xfa, 0x87, 0xc9, 0xcf, 0x11, 0x94, 0xfb, 0xe4, 0x19, 0x27, 0xc8, 0x21, + 0xc8, 0x39, 0x0d, 0x99, 0x98, 0xe4, 0x9c, 0xc6, 0x1e, 0x5d, 0x7d, 0xbf, 0x31, 0xcc, 0x66, 0x1b, + 0xc3, 0x5c, 0xda, 0x18, 0x3e, 0xec, 0x83, 0xab, 0x1c, 0xee, 0xe4, 0x7a, 0x47, 0x69, 0xbd, 0x0f, + 0xde, 0x66, 0x72, 0x03, 0xb7, 0x19, 0x03, 0xe6, 0x7a, 0xf1, 0x9d, 0x57, 0x24, 0x6b, 0x92, 0xe4, + 0x22, 0x36, 0x99, 0xd7, 0xf5, 0xa5, 0x49, 0x47, 0x04, 0x47, 0xb1, 0xe3, 0xb8, 0xfc, 0x7e, 0x26, + 0x50, 0xf0, 0xe7, 0xbd, 0xdf, 0x72, 0x53, 0x62, 0xff, 0x22, 0x07, 0x9f, 0x1a, 0x22, 0xf6, 0xd8, + 0xd3, 0xfa, 0xf1, 0x90, 0x3d, 0xf6, 0x19, 0x73, 0x23, 0x7d, 0x46, 0x71, 0x9c, 0xcf, 0x98, 0xcf, + 0xd6, 0x17, 0xa4, 0xf5, 0xf5, 0x36, 0x82, 0x63, 0xeb, 0x2d, 0xcb, 0x6d, 0x52, 0x65, 0xe8, 0x4a, + 0x4b, 0x06, 0xcc, 0x49, 0x1e, 0x2a, 0xf1, 0x96, 0xe4, 0x18, 0x5d, 0x55, 0x60, 0xc1, 0xee, 0x32, + 0x46, 0xdd, 0xe4, 0x44, 0x45, 0x99, 0x5a, 0xff, 0x30, 0x3f, 0xa7, 0x3e, 0x8f, 0x28, 0x5e, 0x37, + 0x88, 0xa7, 0x46, 0x3e, 0x79, 0x60, 0x9c, 0x5c, 0x82, 0xc5, 0x7e, 0x98, 0xf2, 0x82, 0xa0, 0xe7, + 0x56, 0x28, 0x5d, 0x64, 0x20, 0x3f, 0xcd, 0xc1, 0xf2, 0x10, 0x6b, 0x18, 0x9f, 0x8a, 0x7e, 0x6c, + 0xcc, 0x61, 0xdb, 0x63, 0xf2, 0x0c, 0x14, 0xcd, 0x88, 0xe0, 0x5e, 0xc4, 0x63, 0x7e, 0xcb, 0x72, + 0x85, 0xed, 0x17, 0x4d, 0x49, 0x4d, 0x69, 0x08, 0x57, 0xc0, 0x50, 0xea, 0xb9, 0x6c, 0x47, 0x01, + 0x8e, 0x59, 0x1d, 0x1a, 0x52, 0x16, 0x8c, 0x0a, 0x6f, 0x3d, 0xab, 0xdd, 0x55, 0x0e, 0x3a, 0x22, + 0xc8, 0xeb, 0xb9, 0x7e, 0x36, 0x66, 0xd7, 0xfd, 0xf8, 0x2b, 0x7a, 0x11, 0x66, 0x2d, 0x81, 0x56, + 0x1e, 0x3c, 0x49, 0x0d, 0xa8, 0xb4, 0x98, 0xad, 0xd2, 0xf9, 0x94, 0x4a, 0xd7, 0x72, 0x06, 0x22, + 0x1f, 0xe4, 0xa0, 0x3c, 0x4a, 0x21, 0xb7, 0xeb, 0xff, 0x6f, 0x2a, 0xc1, 0x16, 0x18, 0x6c, 0x84, + 0x95, 0x19, 0x20, 0x12, 0xfb, 0xd3, 0xa9, 0x34, 0x63, 0x94, 0x49, 0x9a, 0x23, 0xd9, 0x90, 0x6f, + 0x20, 0x38, 0x9e, 0xfe, 0x2c, 0xd8, 0x74, 0x82, 0x30, 0xf6, 0x17, 0xdb, 0x30, 0x17, 0x89, 0x12, + 0x5d, 0xe9, 0x4a, 0xf5, 0xcd, 0x69, 0x13, 0xfd, 0xd4, 0xee, 0x2a, 0xe6, 0xe4, 0xd1, 0x54, 0xad, + 0x24, 0x89, 0xbf, 0x89, 0xdb, 0x52, 0x97, 0x1b, 0xe5, 0xb6, 0x14, 0x4d, 0xde, 0x9a, 0x49, 0xa7, + 0x9a, 0x5e, 0x63, 0xd3, 0x6b, 0x66, 0x94, 0x25, 0xb3, 0x2d, 0x86, 0xef, 0x86, 0xd7, 0xd0, 0x2a, + 0x90, 0x8a, 0xe4, 0xdf, 0xd9, 0x9e, 0x1b, 0x5a, 0x8e, 0x4b, 0x99, 0xf4, 0xbc, 0xc9, 0x00, 0xdf, + 0xe9, 0xc0, 0x71, 0x6d, 0xba, 0x45, 0x6d, 0xcf, 0x6d, 0x04, 0xc2, 0x64, 0xf2, 0x66, 0x6a, 0x0c, + 0x3f, 0x03, 0xf3, 0x82, 0xbe, 0xe5, 0x74, 0xa2, 0x04, 0xa5, 0x54, 0x5f, 0xa9, 0x46, 0xad, 0x82, + 0xaa, 0xde, 0x2a, 0x48, 0x74, 0xd8, 0xa1, 0xa1, 0x55, 0xed, 0x5d, 0xac, 0xf2, 0x2f, 0xcc, 0xe4, + 0x63, 0x8e, 0x25, 0xb4, 0x9c, 0xf6, 0xa6, 0xe3, 0x8a, 0x0b, 0x27, 0x5f, 0x2a, 0x19, 0xe0, 0xd6, + 0xb8, 0xcd, 0xf3, 0xb1, 0x7b, 0xca, 0xe7, 0x45, 0x14, 0xff, 0xaa, 0xeb, 0x86, 0x4e, 0x5b, 0xac, + 0x1f, 0xd9, 0x5a, 0x32, 0x20, 0xbe, 0x72, 0xda, 0x21, 0x65, 0xd2, 0xd9, 0x49, 0x2a, 0xb6, 0xf7, + 0x52, 0x54, 0xfd, 0x56, 0xbe, 0x36, 0x3a, 0x19, 0x07, 0xf4, 0x93, 0xd1, 0x7f, 0xda, 0x0e, 0x0e, + 0x29, 0xe1, 0x8a, 0x66, 0x40, 0x14, 0xae, 0x8c, 0x43, 0xd1, 0x95, 0x43, 0xd1, 0x03, 0xa7, 0x65, + 0x21, 0xfb, 0xb4, 0x1c, 0x4e, 0x9f, 0x16, 0x71, 0x23, 0x0e, 0xed, 0xd6, 0xba, 0x15, 0x50, 0xe3, + 0x88, 0x60, 0x9d, 0x0c, 0x90, 0xdf, 0x23, 0x28, 0x6e, 0x7a, 0xcd, 0xab, 0x6e, 0xc8, 0x76, 0x45, + 0xed, 0xc4, 0x73, 0x43, 0xea, 0xc6, 0x65, 0x32, 0x49, 0xf2, 0x2d, 0x0a, 0x9d, 0x0e, 0xdd, 0x0a, + 0xad, 0x8e, 0x2f, 0x6f, 0x5e, 0x7b, 0xda, 0xa2, 0xf8, 0x63, 0xae, 0xb6, 0xb6, 0x15, 0x84, 0xc2, + 0xe5, 0x14, 0x4d, 0xf1, 0xcc, 0x05, 0x8c, 0x27, 0x6c, 0x85, 0x4c, 0xfa, 0x9b, 0xd4, 0x98, 0x6e, + 0x80, 0x85, 0x08, 0x9b, 0x24, 0x49, 0x07, 0xee, 0x8f, 0x4b, 0x02, 0xb7, 0x28, 0xeb, 0x38, 0xae, + 0x95, 0x1d, 0x97, 0x27, 0xe8, 0x51, 0x64, 0x54, 0xa4, 0xbc, 0xd4, 0x91, 0xe4, 0x37, 0xec, 0x3b, + 0x8e, 0xdb, 0xf0, 0xee, 0x65, 0x1c, 0xad, 0xe9, 0x16, 0xfc, 0x4b, 0xba, 0xcd, 0xa0, 0xad, 0x18, + 0xfb, 0x81, 0x67, 0xe0, 0x20, 0xf7, 0x18, 0x3d, 0x2a, 0x5f, 0x48, 0xa7, 0x44, 0x46, 0x55, 0x7c, + 0x13, 0x1e, 0x66, 0xfa, 0x43, 0xbc, 0x09, 0x0b, 0x56, 0x10, 0x38, 0x4d, 0x97, 0x36, 0x14, 0xaf, + 0xdc, 0xc4, 0xbc, 0xfa, 0x3f, 0x8d, 0x8a, 0x71, 0x62, 0x86, 0xdc, 0x6f, 0x45, 0x92, 0xaf, 0x23, + 0x38, 0x36, 0x94, 0x49, 0x7c, 0xae, 0x90, 0x16, 0x47, 0xca, 0x50, 0x0c, 0xec, 0x16, 0x6d, 0x74, + 0xdb, 0x2a, 0x55, 0x88, 0x69, 0xfe, 0xae, 0xd1, 0x8d, 0x76, 0x5f, 0xc6, 0xb1, 0x98, 0xc6, 0x27, + 0x00, 0x3a, 0x96, 0xdb, 0xb5, 0xda, 0x02, 0xc2, 0x8c, 0x80, 0xa0, 0x8d, 0x90, 0x25, 0x28, 0x0f, + 0x33, 0x1d, 0x59, 0xa8, 0xfe, 0x27, 0x82, 0x43, 0xca, 0xe5, 0xca, 0xdd, 0xad, 0xc0, 0x82, 0xa6, + 0x06, 0x2d, 0xaf, 0xed, 0x1f, 0x1e, 0xe3, 0x4e, 0x95, 0x95, 0xe4, 0xd3, 0x9d, 0xc2, 0x5e, 0xaa, + 0xd7, 0x37, 0x71, 0xc0, 0x45, 0xfb, 0x74, 0xef, 0xf9, 0x1a, 0x18, 0xd7, 0x2d, 0xd7, 0x6a, 0xd2, + 0x46, 0x2c, 0x76, 0x6c, 0x62, 0x2f, 0xea, 0x25, 0xcc, 0xa9, 0x0b, 0x86, 0x71, 0x12, 0xed, 0x6c, + 0x6f, 0xab, 0x72, 0x28, 0x83, 0xe2, 0xa6, 0xe3, 0xee, 0x6c, 0xb8, 0xdb, 0x1e, 0x97, 0x38, 0x74, + 0xc2, 0xb6, 0xd2, 0x6e, 0x44, 0xe0, 0xc3, 0x90, 0xef, 0xb2, 0xb6, 0xb4, 0x00, 0xfe, 0xc8, 0xef, + 0xf1, 0x0d, 0x1a, 0xd8, 0xcc, 0xf1, 0xc3, 0xe4, 0x8e, 0xa0, 0x0f, 0xf1, 0x7d, 0x70, 0x6c, 0xcf, + 0x5d, 0x6f, 0x5b, 0x41, 0xa0, 0xc2, 0x53, 0x3c, 0x40, 0x1e, 0x87, 0x83, 0x7c, 0xcd, 0x44, 0xcc, + 0x73, 0x69, 0x31, 0x8f, 0xa5, 0xe0, 0x2b, 0x78, 0x0a, 0xb1, 0x05, 0xf7, 0xf1, 0xac, 0xe0, 0xb2, + 0xef, 0x4b, 0x26, 0x13, 0xa6, 0xa8, 0xf9, 0x61, 0xd1, 0x75, 0x68, 0xc3, 0xa7, 0xfe, 0xce, 0x19, + 0xc0, 0xfa, 0x39, 0xa1, 0xac, 0xe7, 0xd8, 0x14, 0x7f, 0x17, 0xc1, 0x0c, 0x5f, 0x1a, 0x3f, 0x30, + 0xea, 0x58, 0x0a, 0x7b, 0x2d, 0xef, 0x5f, 0x79, 0x8c, 0xaf, 0x46, 0x96, 0x5e, 0xfd, 0xeb, 0xdf, + 0xbf, 0x97, 0x5b, 0xc4, 0x47, 0x45, 0x9b, 0xbf, 0x77, 0x51, 0x6f, 0xb9, 0x07, 0xf8, 0x35, 0x04, + 0x58, 0x66, 0x49, 0x5a, 0x23, 0x14, 0x9f, 0x1b, 0x05, 0x71, 0x48, 0xc3, 0xb4, 0xfc, 0x80, 0x16, + 0x55, 0xaa, 0xb6, 0xc7, 0x28, 0x8f, 0x21, 0x62, 0x82, 0x00, 0xb0, 0x22, 0x00, 0x9c, 0xc2, 0x64, + 0x18, 0x80, 0xda, 0xcb, 0x5c, 0xa3, 0xaf, 0xd4, 0x68, 0xb4, 0xee, 0x9b, 0x08, 0x0a, 0x77, 0xc4, + 0xdd, 0x77, 0x8c, 0x92, 0xb6, 0xf6, 0x4d, 0x49, 0x62, 0x39, 0x81, 0x96, 0x9c, 0x14, 0x48, 0x1f, + 0xc0, 0xc7, 0x15, 0xd2, 0x20, 0x64, 0xd4, 0xea, 0xa4, 0x00, 0x5f, 0x40, 0xf8, 0x6d, 0x04, 0xb3, + 0x51, 0x4b, 0x09, 0x9f, 0x1e, 0x85, 0x32, 0xd5, 0x72, 0x2a, 0xef, 0x5f, 0xa9, 0x8d, 0x3c, 0x24, + 0x30, 0x9e, 0x24, 0x43, 0xb7, 0x73, 0x2d, 0xd5, 0xbd, 0x79, 0x03, 0x41, 0xfe, 0x1a, 0x1d, 0x6b, + 0x6f, 0xfb, 0x08, 0x6e, 0x40, 0x81, 0x43, 0xb6, 0x1a, 0xbf, 0x85, 0xe0, 0xfe, 0x6b, 0x34, 0x1c, + 0x1e, 0x1e, 0x71, 0x65, 0x7c, 0xcc, 0x92, 0x66, 0x77, 0x6e, 0x82, 0x99, 0x71, 0x5c, 0xa8, 0x09, + 0x64, 0x0f, 0xe1, 0xb3, 0x59, 0x46, 0x18, 0xec, 0xba, 0xf6, 0x3d, 0x89, 0xe3, 0xcf, 0x08, 0x0e, + 0xf7, 0xff, 0xe0, 0x01, 0x93, 0xbe, 0x3b, 0xca, 0x90, 0xdf, 0x43, 0x94, 0x6f, 0x4c, 0xeb, 0x65, + 0xd3, 0x4c, 0xc9, 0x65, 0x81, 0xfc, 0x31, 0xfc, 0x68, 0x16, 0xf2, 0xb8, 0x3e, 0x5f, 0x7b, 0x59, + 0x3d, 0xbe, 0x22, 0x7e, 0x9c, 0x23, 0x60, 0xbf, 0x8b, 0xe0, 0xa8, 0xe2, 0xbb, 0xde, 0xb2, 0x58, + 0x78, 0x85, 0xf2, 0x0c, 0x3b, 0x98, 0x48, 0x9e, 0x29, 0xa3, 0x86, 0xbe, 0x1e, 0xb9, 0x2a, 0x64, + 0x79, 0x12, 0x3f, 0xb1, 0x67, 0x59, 0x6c, 0xce, 0xa6, 0x21, 0x61, 0xbf, 0x83, 0xe0, 0xd0, 0x35, + 0x1a, 0x3e, 0xb7, 0xbe, 0xb1, 0xa7, 0x9d, 0x99, 0xd2, 0xd0, 0xb5, 0xe5, 0xc8, 0x15, 0x21, 0xc8, + 0x67, 0xf1, 0xe3, 0x7b, 0x16, 0xc4, 0xb3, 0x9d, 0x78, 0x5f, 0x5e, 0x45, 0x70, 0xe0, 0x1a, 0x0d, + 0xaf, 0xc7, 0xbd, 0xae, 0xd3, 0x13, 0xb5, 0xfb, 0xcb, 0x4b, 0x55, 0xed, 0xb7, 0x4d, 0xea, 0x55, + 0x6c, 0xea, 0xab, 0x02, 0xdb, 0x59, 0x7c, 0x3a, 0x0b, 0x5b, 0xd2, 0x5f, 0x7b, 0x13, 0xc1, 0x31, + 0x1d, 0x44, 0xf2, 0x33, 0x89, 0x4f, 0xef, 0xed, 0xc7, 0x07, 0xf2, 0x27, 0x0c, 0x63, 0xd0, 0xd5, + 0x05, 0xba, 0xf3, 0x64, 0xf8, 0x41, 0xec, 0x0c, 0xa0, 0x58, 0x43, 0x2b, 0x15, 0x84, 0xff, 0x80, + 0x60, 0x36, 0x6a, 0x35, 0x8d, 0xd6, 0x51, 0xaa, 0x4f, 0xbe, 0x9f, 0x5e, 0x4d, 0x5a, 0x6d, 0xf9, + 0xc2, 0x70, 0x85, 0xea, 0xdf, 0xab, 0xad, 0xad, 0x0a, 0x2d, 0xa7, 0xdd, 0xf1, 0xaf, 0x11, 0x40, + 0xd2, 0x2e, 0xc3, 0x0f, 0x65, 0xcb, 0xa1, 0xb5, 0xd4, 0xca, 0xfb, 0xdb, 0x30, 0x23, 0x55, 0x21, + 0x4f, 0xa5, 0xbc, 0x9c, 0xe9, 0x0b, 0x7d, 0x6a, 0xaf, 0x45, 0xad, 0xb5, 0x9f, 0x20, 0x28, 0x88, + 0x3a, 0x3a, 0x3e, 0x35, 0x0a, 0xb3, 0x5e, 0x66, 0xdf, 0x4f, 0xd5, 0x9f, 0x11, 0x50, 0x97, 0xeb, + 0x59, 0x01, 0x65, 0x0d, 0xad, 0xe0, 0x1e, 0xcc, 0x46, 0xb5, 0xdd, 0xd1, 0xe6, 0x91, 0xaa, 0xfd, + 0x96, 0x97, 0x33, 0x12, 0x9c, 0xc8, 0x50, 0x65, 0x2c, 0x5b, 0x19, 0x17, 0xcb, 0x66, 0x78, 0xb8, + 0xc1, 0x27, 0xb3, 0x82, 0xd1, 0x7f, 0x41, 0x31, 0xe7, 0x04, 0xba, 0xd3, 0x64, 0x79, 0x5c, 0x3c, + 0xe3, 0xda, 0xf9, 0x3e, 0x82, 0xc3, 0xfd, 0x97, 0x04, 0x7c, 0x7c, 0x68, 0xbd, 0x4d, 0xc6, 0xd6, + 0xb4, 0x16, 0x47, 0x5d, 0x30, 0xc8, 0xe7, 0x04, 0x8a, 0x35, 0xfc, 0xc8, 0xd8, 0x93, 0x71, 0x43, + 0x79, 0x1d, 0xce, 0x68, 0x35, 0xe9, 0xfd, 0xff, 0x06, 0xc1, 0x01, 0xc5, 0xf7, 0x16, 0xa3, 0x34, + 0x1b, 0xd6, 0xfe, 0x1d, 0x04, 0xbe, 0x16, 0x79, 0x5c, 0xc0, 0xff, 0x0c, 0xbe, 0x34, 0x21, 0x7c, + 0x05, 0x7b, 0x35, 0xe4, 0x48, 0xff, 0x88, 0xe0, 0xc8, 0x9d, 0xc8, 0xee, 0x3f, 0x22, 0xfc, 0xeb, + 0x02, 0xff, 0x13, 0xf8, 0xb1, 0x8c, 0x7c, 0x75, 0x9c, 0x18, 0x17, 0x10, 0xfe, 0x25, 0x82, 0xa2, + 0xea, 0x6a, 0xe2, 0xb3, 0x23, 0x0f, 0x46, 0xba, 0xef, 0xb9, 0x9f, 0xc6, 0x2c, 0x93, 0x33, 0x72, + 0x2a, 0x33, 0x9a, 0xca, 0xf5, 0xb9, 0x41, 0xbf, 0x81, 0x00, 0xc7, 0x77, 0xff, 0xb8, 0x1a, 0x80, + 0xcf, 0xa4, 0x96, 0x1a, 0x59, 0x60, 0x2a, 0x9f, 0x1d, 0x3b, 0x2f, 0x1d, 0x4a, 0x57, 0x32, 0x43, + 0xa9, 0x17, 0xaf, 0xff, 0x3a, 0x82, 0xd2, 0x35, 0x1a, 0xdf, 0xa5, 0x32, 0x74, 0x99, 0x6e, 0xca, + 0x96, 0x2b, 0xe3, 0x27, 0x4a, 0x44, 0xe7, 0x05, 0xa2, 0x33, 0x38, 0x5b, 0x55, 0x0a, 0xc0, 0x0f, + 0x10, 0x1c, 0xbc, 0xa9, 0x9b, 0x28, 0x3e, 0x3f, 0x6e, 0xa5, 0x94, 0x27, 0x9f, 0x1c, 0xd7, 0xc3, + 0x02, 0xd7, 0x2a, 0x99, 0x08, 0xd7, 0x9a, 0xec, 0x6f, 0xfe, 0x08, 0x45, 0x97, 0xf1, 0xbe, 0xaa, + 0xfd, 0x7f, 0xaa, 0xb7, 0x8c, 0xe2, 0x3f, 0xb9, 0x24, 0xf0, 0x55, 0xf1, 0xf9, 0x49, 0xf0, 0xd5, + 0x64, 0x29, 0x1f, 0xff, 0x10, 0xc1, 0x11, 0xd1, 0xb6, 0xd1, 0x19, 0xe3, 0xac, 0x4e, 0x45, 0xd2, + 0xe4, 0x99, 0x20, 0xc4, 0x3c, 0x19, 0xf9, 0x1f, 0xb2, 0x27, 0x50, 0x6b, 0xb2, 0x21, 0xf3, 0xcd, + 0x1c, 0xe2, 0xfb, 0x7b, 0xdf, 0x00, 0xbe, 0xdb, 0xf5, 0x3e, 0x05, 0x8e, 0x6e, 0x43, 0x4d, 0x80, + 0x71, 0x4d, 0x60, 0xbc, 0x44, 0x6a, 0x7b, 0xc1, 0x58, 0xeb, 0xd5, 0xf9, 0x31, 0xfd, 0x36, 0x82, + 0x43, 0x2a, 0xec, 0x4a, 0xfb, 0x5b, 0x1d, 0xb7, 0xb5, 0x7b, 0x0d, 0xd3, 0xf2, 0x40, 0xac, 0x4c, + 0x76, 0x20, 0xde, 0x46, 0x30, 0x27, 0xbb, 0x2a, 0x19, 0xc9, 0x8c, 0xd6, 0x76, 0x29, 0xf7, 0x55, + 0x93, 0x64, 0xd9, 0x9d, 0x7c, 0x49, 0x2c, 0xfb, 0x3c, 0xce, 0x54, 0x8b, 0xef, 0x35, 0x82, 0xda, + 0xcb, 0xb2, 0xe6, 0xfd, 0x4a, 0xad, 0xed, 0x35, 0x83, 0x17, 0x08, 0xce, 0x0c, 0xd9, 0x7c, 0xce, + 0x05, 0x84, 0x43, 0x98, 0xe7, 0xe6, 0x2b, 0x4a, 0x54, 0x78, 0xb9, 0xaf, 0xa0, 0x35, 0x50, 0xbd, + 0x2a, 0x97, 0x07, 0x4a, 0x5e, 0x49, 0x8c, 0x96, 0x05, 0x03, 0xfc, 0x60, 0xe6, 0xb2, 0x62, 0xa1, + 0xd7, 0x10, 0x1c, 0xd1, 0xcf, 0x63, 0xb4, 0xfc, 0xc4, 0xa7, 0x31, 0x0b, 0x85, 0x4c, 0xfb, 0xf1, + 0xca, 0x44, 0x66, 0x24, 0xe0, 0x3c, 0xf5, 0xf4, 0x9f, 0xde, 0x3f, 0x81, 0xde, 0x7b, 0xff, 0x04, + 0xfa, 0xdb, 0xfb, 0x27, 0xd0, 0x0b, 0x8f, 0x4c, 0xf6, 0x2f, 0x25, 0x76, 0xdb, 0xa1, 0x6e, 0xa8, + 0xb3, 0xff, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xd1, 0x3b, 0x5f, 0x38, 0x33, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -5062,6 +5433,90 @@ func (m *ApplicationResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *ApplicationValidateResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ApplicationValidateResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ApplicationValidateResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Entity != nil { + i -= len(*m.Entity) + copy(dAtA[i:], *m.Entity) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.Entity))) + i-- + dAtA[i] = 0x12 + } + if m.Error != nil { + i -= len(*m.Error) + copy(dAtA[i:], *m.Error) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.Error))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ApplicationRolloutRollbackResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ApplicationRolloutRollbackResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ApplicationRolloutRollbackResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.NewRevision == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("newRevision") + } else { + i = encodeVarintApplication(dAtA, i, uint64(*m.NewRevision)) + i-- + dAtA[i] = 0x10 + } + if m.Rollout == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("rollout") + } else { + i -= len(*m.Rollout) + copy(dAtA[i:], *m.Rollout) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.Rollout))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *ApplicationCreateRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -5592,6 +6047,117 @@ func (m *ApplicationPatchRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } +func (m *ApplicationValidationRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ApplicationValidationRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ApplicationValidationRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Application == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("application") + } else { + { + size, err := m.Application.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintApplication(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ApplicationRolloutRollbackRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ApplicationRolloutRollbackRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ApplicationRolloutRollbackRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.RolloutRevision == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("rolloutRevision") + } else { + i = encodeVarintApplication(dAtA, i, uint64(*m.RolloutRevision)) + i-- + dAtA[i] = 0x28 + } + if m.RolloutNamespace == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("rolloutNamespace") + } else { + i -= len(*m.RolloutNamespace) + copy(dAtA[i:], *m.RolloutNamespace) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.RolloutNamespace))) + i-- + dAtA[i] = 0x22 + } + if m.RolloutName == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("rolloutName") + } else { + i -= len(*m.RolloutName) + copy(dAtA[i:], *m.RolloutName) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.RolloutName))) + i-- + dAtA[i] = 0x1a + } + if m.Namespace == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("namespace") + } else { + i -= len(*m.Namespace) + copy(dAtA[i:], *m.Namespace) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.Namespace))) + i-- + dAtA[i] = 0x12 + } + if m.Name == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") + } else { + i -= len(*m.Name) + copy(dAtA[i:], *m.Name) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *ApplicationRollbackRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -5869,6 +6435,99 @@ func (m *ApplicationResourcePatchRequest) MarshalToSizedBuffer(dAtA []byte) (int return len(dAtA) - i, nil } +func (m *ChangeRevisionRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ChangeRevisionRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ChangeRevisionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.PreviousRevision != nil { + i -= len(*m.PreviousRevision) + copy(dAtA[i:], *m.PreviousRevision) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.PreviousRevision))) + i-- + dAtA[i] = 0x22 + } + if m.CurrentRevision != nil { + i -= len(*m.CurrentRevision) + copy(dAtA[i:], *m.CurrentRevision) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.CurrentRevision))) + i-- + dAtA[i] = 0x1a + } + if m.Namespace != nil { + i -= len(*m.Namespace) + copy(dAtA[i:], *m.Namespace) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.Namespace))) + i-- + dAtA[i] = 0x12 + } + if m.AppName == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("appName") + } else { + i -= len(*m.AppName) + copy(dAtA[i:], *m.AppName) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.AppName))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ChangeRevisionResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ChangeRevisionResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ChangeRevisionResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Revision == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("revision") + } else { + i -= len(*m.Revision) + copy(dAtA[i:], *m.Revision) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.Revision))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *ApplicationResourceDeleteRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -7377,21 +8036,19 @@ func (m *ApplicationResponse) Size() (n int) { return n } -func (m *ApplicationCreateRequest) Size() (n int) { +func (m *ApplicationValidateResponse) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.Application != nil { - l = m.Application.Size() + if m.Error != nil { + l = len(*m.Error) n += 1 + l + sovApplication(uint64(l)) } - if m.Upsert != nil { - n += 2 - } - if m.Validate != nil { - n += 2 + if m.Entity != nil { + l = len(*m.Entity) + n += 1 + l + sovApplication(uint64(l)) } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) @@ -7399,17 +8056,58 @@ func (m *ApplicationCreateRequest) Size() (n int) { return n } -func (m *ApplicationUpdateRequest) Size() (n int) { +func (m *ApplicationRolloutRollbackResponse) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.Application != nil { - l = m.Application.Size() + if m.Rollout != nil { + l = len(*m.Rollout) n += 1 + l + sovApplication(uint64(l)) } - if m.Validate != nil { + if m.NewRevision != nil { + n += 1 + sovApplication(uint64(*m.NewRevision)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ApplicationCreateRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Application != nil { + l = m.Application.Size() + n += 1 + l + sovApplication(uint64(l)) + } + if m.Upsert != nil { + n += 2 + } + if m.Validate != nil { + n += 2 + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ApplicationUpdateRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Application != nil { + l = m.Application.Size() + n += 1 + l + sovApplication(uint64(l)) + } + if m.Validate != nil { n += 2 } if m.Project != nil { @@ -7609,6 +8307,53 @@ func (m *ApplicationPatchRequest) Size() (n int) { return n } +func (m *ApplicationValidationRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Application != nil { + l = m.Application.Size() + n += 1 + l + sovApplication(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ApplicationRolloutRollbackRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Name != nil { + l = len(*m.Name) + n += 1 + l + sovApplication(uint64(l)) + } + if m.Namespace != nil { + l = len(*m.Namespace) + n += 1 + l + sovApplication(uint64(l)) + } + if m.RolloutName != nil { + l = len(*m.RolloutName) + n += 1 + l + sovApplication(uint64(l)) + } + if m.RolloutNamespace != nil { + l = len(*m.RolloutNamespace) + n += 1 + l + sovApplication(uint64(l)) + } + if m.RolloutRevision != nil { + n += 1 + sovApplication(uint64(*m.RolloutRevision)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *ApplicationRollbackRequest) Size() (n int) { if m == nil { return 0 @@ -7738,6 +8483,50 @@ func (m *ApplicationResourcePatchRequest) Size() (n int) { return n } +func (m *ChangeRevisionRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.AppName != nil { + l = len(*m.AppName) + n += 1 + l + sovApplication(uint64(l)) + } + if m.Namespace != nil { + l = len(*m.Namespace) + n += 1 + l + sovApplication(uint64(l)) + } + if m.CurrentRevision != nil { + l = len(*m.CurrentRevision) + n += 1 + l + sovApplication(uint64(l)) + } + if m.PreviousRevision != nil { + l = len(*m.PreviousRevision) + n += 1 + l + sovApplication(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ChangeRevisionResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Revision != nil { + l = len(*m.Revision) + n += 1 + l + sovApplication(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *ApplicationResourceDeleteRequest) Size() (n int) { if m == nil { return 0 @@ -9968,8 +10757,7 @@ func (m *ApplicationResponse) Unmarshal(dAtA []byte) error { } return nil } -func (m *ApplicationCreateRequest) Unmarshal(dAtA []byte) error { - var hasFields [1]uint64 +func (m *ApplicationValidateResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -9992,17 +10780,17 @@ func (m *ApplicationCreateRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ApplicationCreateRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ApplicationValidateResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ApplicationCreateRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ApplicationValidateResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Application", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowApplication @@ -10012,34 +10800,30 @@ func (m *ApplicationCreateRequest) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthApplication } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthApplication } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Application == nil { - m.Application = &v1alpha1.Application{} - } - if err := m.Application.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + s := string(dAtA[iNdEx:postIndex]) + m.Error = &s iNdEx = postIndex - hasFields[0] |= uint64(0x00000001) case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Upsert", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Entity", wireType) } - var v int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowApplication @@ -10049,34 +10833,25 @@ func (m *ApplicationCreateRequest) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - b := bool(v != 0) - m.Upsert = &b - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Validate", wireType) + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApplication - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication } - b := bool(v != 0) - m.Validate = &b + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Entity = &s + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipApplication(dAtA[iNdEx:]) @@ -10093,16 +10868,13 @@ func (m *ApplicationCreateRequest) Unmarshal(dAtA []byte) error { iNdEx += skippy } } - if hasFields[0]&uint64(0x00000001) == 0 { - return github_com_gogo_protobuf_proto.NewRequiredNotSetError("application") - } if iNdEx > l { return io.ErrUnexpectedEOF } return nil } -func (m *ApplicationUpdateRequest) Unmarshal(dAtA []byte) error { +func (m *ApplicationRolloutRollbackResponse) Unmarshal(dAtA []byte) error { var hasFields [1]uint64 l := len(dAtA) iNdEx := 0 @@ -10126,17 +10898,17 @@ func (m *ApplicationUpdateRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ApplicationUpdateRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ApplicationRolloutRollbackResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ApplicationUpdateRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ApplicationRolloutRollbackResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Application", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Rollout", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowApplication @@ -10146,55 +10918,31 @@ func (m *ApplicationUpdateRequest) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthApplication } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthApplication } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Application == nil { - m.Application = &v1alpha1.Application{} - } - if err := m.Application.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + s := string(dAtA[iNdEx:postIndex]) + m.Rollout = &s iNdEx = postIndex hasFields[0] |= uint64(0x00000001) case 2: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Validate", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApplication - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - b := bool(v != 0) - m.Validate = &b - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Project", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field NewRevision", wireType) } - var stringLen uint64 + var v int64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowApplication @@ -10204,25 +10952,13 @@ func (m *ApplicationUpdateRequest) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + v |= int64(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthApplication - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthApplication - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - s := string(dAtA[iNdEx:postIndex]) - m.Project = &s - iNdEx = postIndex + m.NewRevision = &v + hasFields[0] |= uint64(0x00000002) default: iNdEx = preIndex skippy, err := skipApplication(dAtA[iNdEx:]) @@ -10240,7 +10976,10 @@ func (m *ApplicationUpdateRequest) Unmarshal(dAtA []byte) error { } } if hasFields[0]&uint64(0x00000001) == 0 { - return github_com_gogo_protobuf_proto.NewRequiredNotSetError("application") + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("rollout") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("newRevision") } if iNdEx > l { @@ -10248,7 +10987,7 @@ func (m *ApplicationUpdateRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *ApplicationDeleteRequest) Unmarshal(dAtA []byte) error { +func (m *ApplicationCreateRequest) Unmarshal(dAtA []byte) error { var hasFields [1]uint64 l := len(dAtA) iNdEx := 0 @@ -10272,17 +11011,17 @@ func (m *ApplicationDeleteRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ApplicationDeleteRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ApplicationCreateRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ApplicationDeleteRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ApplicationCreateRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Application", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowApplication @@ -10292,29 +11031,32 @@ func (m *ApplicationDeleteRequest) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthApplication } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthApplication } if postIndex > l { return io.ErrUnexpectedEOF } - s := string(dAtA[iNdEx:postIndex]) - m.Name = &s + if m.Application == nil { + m.Application = &v1alpha1.Application{} + } + if err := m.Application.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex hasFields[0] |= uint64(0x00000001) case 2: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Cascade", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Upsert", wireType) } var v int for shift := uint(0); ; shift += 7 { @@ -10332,78 +11074,12 @@ func (m *ApplicationDeleteRequest) Unmarshal(dAtA []byte) error { } } b := bool(v != 0) - m.Cascade = &b + m.Upsert = &b case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PropagationPolicy", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApplication - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthApplication - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthApplication - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - s := string(dAtA[iNdEx:postIndex]) - m.PropagationPolicy = &s - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AppNamespace", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApplication - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthApplication - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthApplication - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - s := string(dAtA[iNdEx:postIndex]) - m.AppNamespace = &s - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Project", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Validate", wireType) } - var stringLen uint64 + var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowApplication @@ -10413,25 +11089,13 @@ func (m *ApplicationDeleteRequest) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + v |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthApplication - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthApplication - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - s := string(dAtA[iNdEx:postIndex]) - m.Project = &s - iNdEx = postIndex + b := bool(v != 0) + m.Validate = &b default: iNdEx = preIndex skippy, err := skipApplication(dAtA[iNdEx:]) @@ -10449,7 +11113,7 @@ func (m *ApplicationDeleteRequest) Unmarshal(dAtA []byte) error { } } if hasFields[0]&uint64(0x00000001) == 0 { - return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("application") } if iNdEx > l { @@ -10457,7 +11121,8 @@ func (m *ApplicationDeleteRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *SyncOptions) Unmarshal(dAtA []byte) error { +func (m *ApplicationUpdateRequest) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -10480,15 +11145,73 @@ func (m *SyncOptions) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SyncOptions: wiretype end group for non-group") + return fmt.Errorf("proto: ApplicationUpdateRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SyncOptions: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ApplicationUpdateRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Application", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Application == nil { + m.Application = &v1alpha1.Application{} + } + if err := m.Application.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Validate", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Validate = &b + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Project", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -10516,7 +11239,8 @@ func (m *SyncOptions) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Items = append(m.Items, string(dAtA[iNdEx:postIndex])) + s := string(dAtA[iNdEx:postIndex]) + m.Project = &s iNdEx = postIndex default: iNdEx = preIndex @@ -10534,13 +11258,16 @@ func (m *SyncOptions) Unmarshal(dAtA []byte) error { iNdEx += skippy } } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("application") + } if iNdEx > l { return io.ErrUnexpectedEOF } return nil } -func (m *ApplicationSyncRequest) Unmarshal(dAtA []byte) error { +func (m *ApplicationDeleteRequest) Unmarshal(dAtA []byte) error { var hasFields [1]uint64 l := len(dAtA) iNdEx := 0 @@ -10564,10 +11291,10 @@ func (m *ApplicationSyncRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ApplicationSyncRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ApplicationDeleteRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ApplicationSyncRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ApplicationDeleteRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -10605,8 +11332,29 @@ func (m *ApplicationSyncRequest) Unmarshal(dAtA []byte) error { iNdEx = postIndex hasFields[0] |= uint64(0x00000001) case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Cascade", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Cascade = &b + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Revision", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field PropagationPolicy", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -10635,13 +11383,13 @@ func (m *ApplicationSyncRequest) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } s := string(dAtA[iNdEx:postIndex]) - m.Revision = &s + m.PropagationPolicy = &s iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field DryRun", wireType) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AppNamespace", wireType) } - var v int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowApplication @@ -10651,18 +11399,30 @@ func (m *ApplicationSyncRequest) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - b := bool(v != 0) - m.DryRun = &b - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Prune", wireType) + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication } - var v int + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.AppNamespace = &s + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Project", wireType) + } + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowApplication @@ -10672,18 +11432,84 @@ func (m *ApplicationSyncRequest) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - b := bool(v != 0) - m.Prune = &b - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Strategy", wireType) + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication } - var msglen int + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Project = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipApplication(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthApplication + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SyncOptions) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SyncOptions: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SyncOptions: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + } + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowApplication @@ -10693,33 +11519,81 @@ func (m *ApplicationSyncRequest) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthApplication } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthApplication } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Strategy == nil { - m.Strategy = &v1alpha1.SyncStrategy{} - } - if err := m.Strategy.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Items = append(m.Items, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipApplication(dAtA[iNdEx:]) + if err != nil { return err } - iNdEx = postIndex - case 7: + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthApplication + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ApplicationSyncRequest) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ApplicationSyncRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ApplicationSyncRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowApplication @@ -10729,29 +11603,29 @@ func (m *ApplicationSyncRequest) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthApplication } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthApplication } if postIndex > l { return io.ErrUnexpectedEOF } - m.Resources = append(m.Resources, &v1alpha1.SyncOperationResource{}) - if err := m.Resources[len(m.Resources)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + s := string(dAtA[iNdEx:postIndex]) + m.Name = &s iNdEx = postIndex - case 8: + hasFields[0] |= uint64(0x00000001) + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Manifests", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Revision", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -10779,11 +11653,54 @@ func (m *ApplicationSyncRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Manifests = append(m.Manifests, string(dAtA[iNdEx:postIndex])) + s := string(dAtA[iNdEx:postIndex]) + m.Revision = &s iNdEx = postIndex - case 9: + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DryRun", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.DryRun = &b + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Prune", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Prune = &b + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Infos", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Strategy", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -10810,14 +11727,862 @@ func (m *ApplicationSyncRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Infos = append(m.Infos, &v1alpha1.Info{}) - if err := m.Infos[len(m.Infos)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.Strategy == nil { + m.Strategy = &v1alpha1.SyncStrategy{} + } + if err := m.Strategy.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 10: + case 7: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RetryStrategy", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Resources = append(m.Resources, &v1alpha1.SyncOperationResource{}) + if err := m.Resources[len(m.Resources)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Manifests", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Manifests = append(m.Manifests, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Infos", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Infos = append(m.Infos, &v1alpha1.Info{}) + if err := m.Infos[len(m.Infos)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RetryStrategy", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.RetryStrategy == nil { + m.RetryStrategy = &v1alpha1.RetryStrategy{} + } + if err := m.RetryStrategy.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SyncOptions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.SyncOptions == nil { + m.SyncOptions = &SyncOptions{} + } + if err := m.SyncOptions.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 12: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AppNamespace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.AppNamespace = &s + iNdEx = postIndex + case 13: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Project", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Project = &s + iNdEx = postIndex + case 14: + if wireType == 0 { + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.SourcePositions = append(m.SourcePositions, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + packedLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var elementCount int + var count int + for _, integer := range dAtA[iNdEx:postIndex] { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(m.SourcePositions) == 0 { + m.SourcePositions = make([]int64, 0, elementCount) + } + for iNdEx < postIndex { + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.SourcePositions = append(m.SourcePositions, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field SourcePositions", wireType) + } + case 15: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Revisions", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Revisions = append(m.Revisions, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipApplication(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthApplication + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ApplicationUpdateSpecRequest) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ApplicationUpdateSpecRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ApplicationUpdateSpecRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Name = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Spec == nil { + m.Spec = &v1alpha1.ApplicationSpec{} + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000002) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Validate", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Validate = &b + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AppNamespace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.AppNamespace = &s + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Project", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Project = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipApplication(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthApplication + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("spec") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ApplicationPatchRequest) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ApplicationPatchRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ApplicationPatchRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Name = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Patch", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Patch = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000002) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PatchType", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.PatchType = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000004) + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AppNamespace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.AppNamespace = &s + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Project", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Project = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipApplication(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthApplication + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("patch") + } + if hasFields[0]&uint64(0x00000004) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("patchType") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ApplicationValidationRequest) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ApplicationValidationRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ApplicationValidationRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Application", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -10844,18 +12609,74 @@ func (m *ApplicationSyncRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.RetryStrategy == nil { - m.RetryStrategy = &v1alpha1.RetryStrategy{} + if m.Application == nil { + m.Application = &v1alpha1.Application{} } - if err := m.RetryStrategy.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Application.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 11: + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipApplication(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthApplication + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("application") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ApplicationRolloutRollbackRequest) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ApplicationRolloutRollbackRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ApplicationRolloutRollbackRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SyncOptions", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowApplication @@ -10865,31 +12686,29 @@ func (m *ApplicationSyncRequest) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthApplication } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthApplication } if postIndex > l { return io.ErrUnexpectedEOF } - if m.SyncOptions == nil { - m.SyncOptions = &SyncOptions{} - } - if err := m.SyncOptions.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + s := string(dAtA[iNdEx:postIndex]) + m.Name = &s iNdEx = postIndex - case 12: + hasFields[0] |= uint64(0x00000001) + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AppNamespace", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -10918,11 +12737,12 @@ func (m *ApplicationSyncRequest) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } s := string(dAtA[iNdEx:postIndex]) - m.AppNamespace = &s + m.Namespace = &s iNdEx = postIndex - case 13: + hasFields[0] |= uint64(0x00000002) + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Project", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RolloutName", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -10951,87 +12771,12 @@ func (m *ApplicationSyncRequest) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } s := string(dAtA[iNdEx:postIndex]) - m.Project = &s + m.RolloutName = &s iNdEx = postIndex - case 14: - if wireType == 0 { - var v int64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApplication - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.SourcePositions = append(m.SourcePositions, v) - } else if wireType == 2 { - var packedLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApplication - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - packedLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if packedLen < 0 { - return ErrInvalidLengthApplication - } - postIndex := iNdEx + packedLen - if postIndex < 0 { - return ErrInvalidLengthApplication - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var elementCount int - var count int - for _, integer := range dAtA[iNdEx:postIndex] { - if integer < 128 { - count++ - } - } - elementCount = count - if elementCount != 0 && len(m.SourcePositions) == 0 { - m.SourcePositions = make([]int64, 0, elementCount) - } - for iNdEx < postIndex { - var v int64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApplication - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.SourcePositions = append(m.SourcePositions, v) - } - } else { - return fmt.Errorf("proto: wrong wireType = %d for field SourcePositions", wireType) - } - case 15: + hasFields[0] |= uint64(0x00000004) + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Revisions", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RolloutNamespace", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -11059,8 +12804,31 @@ func (m *ApplicationSyncRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Revisions = append(m.Revisions, string(dAtA[iNdEx:postIndex])) + s := string(dAtA[iNdEx:postIndex]) + m.RolloutNamespace = &s iNdEx = postIndex + hasFields[0] |= uint64(0x00000008) + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RolloutRevision", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.RolloutRevision = &v + hasFields[0] |= uint64(0x00000010) default: iNdEx = preIndex skippy, err := skipApplication(dAtA[iNdEx:]) @@ -11080,13 +12848,25 @@ func (m *ApplicationSyncRequest) Unmarshal(dAtA []byte) error { if hasFields[0]&uint64(0x00000001) == 0 { return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("namespace") + } + if hasFields[0]&uint64(0x00000004) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("rolloutName") + } + if hasFields[0]&uint64(0x00000008) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("rolloutNamespace") + } + if hasFields[0]&uint64(0x00000010) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("rolloutRevision") + } if iNdEx > l { return io.ErrUnexpectedEOF } return nil } -func (m *ApplicationUpdateSpecRequest) Unmarshal(dAtA []byte) error { +func (m *ApplicationRollbackRequest) Unmarshal(dAtA []byte) error { var hasFields [1]uint64 l := len(dAtA) iNdEx := 0 @@ -11110,10 +12890,10 @@ func (m *ApplicationUpdateSpecRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ApplicationUpdateSpecRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ApplicationRollbackRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ApplicationUpdateSpecRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ApplicationRollbackRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -11151,10 +12931,10 @@ func (m *ApplicationUpdateSpecRequest) Unmarshal(dAtA []byte) error { iNdEx = postIndex hasFields[0] |= uint64(0x00000001) case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) } - var msglen int + var v int64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowApplication @@ -11164,32 +12944,37 @@ func (m *ApplicationUpdateSpecRequest) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + v |= int64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLengthApplication - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthApplication - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Spec == nil { - m.Spec = &v1alpha1.ApplicationSpec{} - } - if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex + m.Id = &v hasFields[0] |= uint64(0x00000002) case 3: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Validate", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field DryRun", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.DryRun = &b + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Prune", wireType) } var v int for shift := uint(0); ; shift += 7 { @@ -11207,8 +12992,8 @@ func (m *ApplicationUpdateSpecRequest) Unmarshal(dAtA []byte) error { } } b := bool(v != 0) - m.Validate = &b - case 4: + m.Prune = &b + case 6: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field AppNamespace", wireType) } @@ -11241,7 +13026,7 @@ func (m *ApplicationUpdateSpecRequest) Unmarshal(dAtA []byte) error { s := string(dAtA[iNdEx:postIndex]) m.AppNamespace = &s iNdEx = postIndex - case 5: + case 7: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Project", wireType) } @@ -11294,7 +13079,7 @@ func (m *ApplicationUpdateSpecRequest) Unmarshal(dAtA []byte) error { return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") } if hasFields[0]&uint64(0x00000002) == 0 { - return github_com_gogo_protobuf_proto.NewRequiredNotSetError("spec") + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("id") } if iNdEx > l { @@ -11302,7 +13087,7 @@ func (m *ApplicationUpdateSpecRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *ApplicationPatchRequest) Unmarshal(dAtA []byte) error { +func (m *ApplicationResourceRequest) Unmarshal(dAtA []byte) error { var hasFields [1]uint64 l := len(dAtA) iNdEx := 0 @@ -11326,10 +13111,10 @@ func (m *ApplicationPatchRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ApplicationPatchRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ApplicationResourceRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ApplicationPatchRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ApplicationResourceRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -11368,7 +13153,7 @@ func (m *ApplicationPatchRequest) Unmarshal(dAtA []byte) error { hasFields[0] |= uint64(0x00000001) case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Patch", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -11397,12 +13182,11 @@ func (m *ApplicationPatchRequest) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } s := string(dAtA[iNdEx:postIndex]) - m.Patch = &s + m.Namespace = &s iNdEx = postIndex - hasFields[0] |= uint64(0x00000002) case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PatchType", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceName", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -11431,12 +13215,12 @@ func (m *ApplicationPatchRequest) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } s := string(dAtA[iNdEx:postIndex]) - m.PatchType = &s + m.ResourceName = &s iNdEx = postIndex - hasFields[0] |= uint64(0x00000004) - case 5: + hasFields[0] |= uint64(0x00000002) + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AppNamespace", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -11465,11 +13249,12 @@ func (m *ApplicationPatchRequest) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } s := string(dAtA[iNdEx:postIndex]) - m.AppNamespace = &s + m.Version = &s iNdEx = postIndex - case 6: + hasFields[0] |= uint64(0x00000004) + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Project", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Group", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -11498,72 +13283,11 @@ func (m *ApplicationPatchRequest) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } s := string(dAtA[iNdEx:postIndex]) - m.Project = &s + m.Group = &s iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipApplication(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthApplication - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - if hasFields[0]&uint64(0x00000001) == 0 { - return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") - } - if hasFields[0]&uint64(0x00000002) == 0 { - return github_com_gogo_protobuf_proto.NewRequiredNotSetError("patch") - } - if hasFields[0]&uint64(0x00000004) == 0 { - return github_com_gogo_protobuf_proto.NewRequiredNotSetError("patchType") - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ApplicationRollbackRequest) Unmarshal(dAtA []byte) error { - var hasFields [1]uint64 - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApplication - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ApplicationRollbackRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ApplicationRollbackRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -11592,73 +13316,10 @@ func (m *ApplicationRollbackRequest) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } s := string(dAtA[iNdEx:postIndex]) - m.Name = &s + m.Kind = &s iNdEx = postIndex - hasFields[0] |= uint64(0x00000001) - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) - } - var v int64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApplication - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Id = &v - hasFields[0] |= uint64(0x00000002) - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field DryRun", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApplication - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - b := bool(v != 0) - m.DryRun = &b - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Prune", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApplication - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - b := bool(v != 0) - m.Prune = &b - case 6: + hasFields[0] |= uint64(0x00000008) + case 7: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field AppNamespace", wireType) } @@ -11691,7 +13352,7 @@ func (m *ApplicationRollbackRequest) Unmarshal(dAtA []byte) error { s := string(dAtA[iNdEx:postIndex]) m.AppNamespace = &s iNdEx = postIndex - case 7: + case 8: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Project", wireType) } @@ -11744,7 +13405,13 @@ func (m *ApplicationRollbackRequest) Unmarshal(dAtA []byte) error { return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") } if hasFields[0]&uint64(0x00000002) == 0 { - return github_com_gogo_protobuf_proto.NewRequiredNotSetError("id") + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("resourceName") + } + if hasFields[0]&uint64(0x00000004) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("version") + } + if hasFields[0]&uint64(0x00000008) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("kind") } if iNdEx > l { @@ -11752,7 +13419,7 @@ func (m *ApplicationRollbackRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *ApplicationResourceRequest) Unmarshal(dAtA []byte) error { +func (m *ApplicationResourcePatchRequest) Unmarshal(dAtA []byte) error { var hasFields [1]uint64 l := len(dAtA) iNdEx := 0 @@ -11776,10 +13443,10 @@ func (m *ApplicationResourceRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ApplicationResourceRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ApplicationResourcePatchRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ApplicationResourceRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ApplicationResourcePatchRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -11950,9 +13617,77 @@ func (m *ApplicationResourceRequest) Unmarshal(dAtA []byte) error { s := string(dAtA[iNdEx:postIndex]) m.Group = &s iNdEx = postIndex - case 6: + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Kind = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000008) + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Patch", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Patch = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000010) + case 8: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field PatchType", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -11981,10 +13716,10 @@ func (m *ApplicationResourceRequest) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } s := string(dAtA[iNdEx:postIndex]) - m.Kind = &s + m.PatchType = &s iNdEx = postIndex - hasFields[0] |= uint64(0x00000008) - case 7: + hasFields[0] |= uint64(0x00000020) + case 9: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field AppNamespace", wireType) } @@ -12017,7 +13752,7 @@ func (m *ApplicationResourceRequest) Unmarshal(dAtA []byte) error { s := string(dAtA[iNdEx:postIndex]) m.AppNamespace = &s iNdEx = postIndex - case 8: + case 10: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Project", wireType) } @@ -12078,13 +13813,19 @@ func (m *ApplicationResourceRequest) Unmarshal(dAtA []byte) error { if hasFields[0]&uint64(0x00000008) == 0 { return github_com_gogo_protobuf_proto.NewRequiredNotSetError("kind") } + if hasFields[0]&uint64(0x00000010) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("patch") + } + if hasFields[0]&uint64(0x00000020) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("patchType") + } if iNdEx > l { return io.ErrUnexpectedEOF } return nil } -func (m *ApplicationResourcePatchRequest) Unmarshal(dAtA []byte) error { +func (m *ChangeRevisionRequest) Unmarshal(dAtA []byte) error { var hasFields [1]uint64 l := len(dAtA) iNdEx := 0 @@ -12108,15 +13849,15 @@ func (m *ApplicationResourcePatchRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ApplicationResourcePatchRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ChangeRevisionRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ApplicationResourcePatchRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ChangeRevisionRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AppName", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -12145,7 +13886,7 @@ func (m *ApplicationResourcePatchRequest) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } s := string(dAtA[iNdEx:postIndex]) - m.Name = &s + m.AppName = &s iNdEx = postIndex hasFields[0] |= uint64(0x00000001) case 2: @@ -12183,7 +13924,7 @@ func (m *ApplicationResourcePatchRequest) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceName", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CurrentRevision", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -12212,79 +13953,11 @@ func (m *ApplicationResourcePatchRequest) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } s := string(dAtA[iNdEx:postIndex]) - m.ResourceName = &s + m.CurrentRevision = &s iNdEx = postIndex - hasFields[0] |= uint64(0x00000002) case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApplication - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthApplication - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthApplication - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - s := string(dAtA[iNdEx:postIndex]) - m.Version = &s - iNdEx = postIndex - hasFields[0] |= uint64(0x00000004) - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Group", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApplication - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthApplication - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthApplication - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - s := string(dAtA[iNdEx:postIndex]) - m.Group = &s - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field PreviousRevision", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -12313,113 +13986,66 @@ func (m *ApplicationResourcePatchRequest) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } s := string(dAtA[iNdEx:postIndex]) - m.Kind = &s + m.PreviousRevision = &s iNdEx = postIndex - hasFields[0] |= uint64(0x00000008) - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Patch", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApplication - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthApplication + default: + iNdEx = preIndex + skippy, err := skipApplication(dAtA[iNdEx:]) + if err != nil { + return err } - postIndex := iNdEx + intStringLen - if postIndex < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApplication } - if postIndex > l { + if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } - s := string(dAtA[iNdEx:postIndex]) - m.Patch = &s - iNdEx = postIndex - hasFields[0] |= uint64(0x00000010) - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PatchType", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApplication - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthApplication - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthApplication + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("appName") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ChangeRevisionResponse) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication } - if postIndex > l { + if iNdEx >= l { return io.ErrUnexpectedEOF } - s := string(dAtA[iNdEx:postIndex]) - m.PatchType = &s - iNdEx = postIndex - hasFields[0] |= uint64(0x00000020) - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AppNamespace", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApplication - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthApplication - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthApplication - } - if postIndex > l { - return io.ErrUnexpectedEOF + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break } - s := string(dAtA[iNdEx:postIndex]) - m.AppNamespace = &s - iNdEx = postIndex - case 10: + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ChangeRevisionResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ChangeRevisionResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Project", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Revision", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -12448,8 +14074,9 @@ func (m *ApplicationResourcePatchRequest) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } s := string(dAtA[iNdEx:postIndex]) - m.Project = &s + m.Revision = &s iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) default: iNdEx = preIndex skippy, err := skipApplication(dAtA[iNdEx:]) @@ -12467,22 +14094,7 @@ func (m *ApplicationResourcePatchRequest) Unmarshal(dAtA []byte) error { } } if hasFields[0]&uint64(0x00000001) == 0 { - return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") - } - if hasFields[0]&uint64(0x00000002) == 0 { - return github_com_gogo_protobuf_proto.NewRequiredNotSetError("resourceName") - } - if hasFields[0]&uint64(0x00000004) == 0 { - return github_com_gogo_protobuf_proto.NewRequiredNotSetError("version") - } - if hasFields[0]&uint64(0x00000008) == 0 { - return github_com_gogo_protobuf_proto.NewRequiredNotSetError("kind") - } - if hasFields[0]&uint64(0x00000010) == 0 { - return github_com_gogo_protobuf_proto.NewRequiredNotSetError("patch") - } - if hasFields[0]&uint64(0x00000020) == 0 { - return github_com_gogo_protobuf_proto.NewRequiredNotSetError("patchType") + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("revision") } if iNdEx > l { diff --git a/pkg/apis/application/v1alpha1/cf_types.go b/pkg/apis/application/v1alpha1/cf_types.go new file mode 100644 index 0000000000000..92c6ea94c55ab --- /dev/null +++ b/pkg/apis/application/v1alpha1/cf_types.go @@ -0,0 +1,46 @@ +package v1alpha1 + +func (n *ResourceNode) GetAllChildNodes(tree *ApplicationTree, kind string) []ResourceNode { + curChildren := []ResourceNode{} + + for _, c := range tree.Nodes { + if (kind == "" || kind == c.Kind) && c.hasInParents(tree, n) { + curChildren = append(curChildren, c) + } + } + + return curChildren +} + +func (n *ResourceNode) hasInParents(tree *ApplicationTree, p *ResourceNode) bool { + if len(n.ParentRefs) == 0 { + return false + } + + for _, curParentRef := range n.ParentRefs { + if curParentRef.IsEqual(p.ResourceRef) { + return true + } + + parentNode := tree.FindNode(curParentRef.Group, curParentRef.Kind, curParentRef.Namespace, curParentRef.Name) + if parentNode == nil { + continue + } + + parentResult := parentNode.hasInParents(tree, p) + if parentResult { + return true + } + } + + return false +} + +func (r ResourceRef) IsEqual(other ResourceRef) bool { + return (r.Group == other.Group && + r.Version == other.Version && + r.Kind == other.Kind && + r.Namespace == other.Namespace && + r.Name == other.Name) || + r.UID == other.UID +} diff --git a/pkg/apis/application/v1alpha1/generated.pb.go b/pkg/apis/application/v1alpha1/generated.pb.go index a9db3e77bb7bd..2a080bad4ba3f 100644 --- a/pkg/apis/application/v1alpha1/generated.pb.go +++ b/pkg/apis/application/v1alpha1/generated.pb.go @@ -4914,775 +4914,777 @@ func init() { } var fileDescriptor_c078c3c476799f44 = []byte{ - // 12287 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x70, 0x24, 0xc9, - 0x71, 0x18, 0xcc, 0x9e, 0xc1, 0x00, 0x33, 0x89, 0xd7, 0xa2, 0x76, 0xf7, 0x0e, 0xbb, 0xf7, 0xc0, - 0xaa, 0x8f, 0x3a, 0x9e, 0x3e, 0xde, 0x01, 0xba, 0xbd, 0x3b, 0xea, 0x3e, 0x9d, 0x44, 0x09, 0x8f, - 0x7d, 0x60, 0x17, 0x58, 0xe0, 0x6a, 0xb0, 0xbb, 0xe2, 0x51, 0xc7, 0x63, 0x63, 0xa6, 0x30, 0xe8, - 0x45, 0x4f, 0xf7, 0x5c, 0x77, 0x0f, 0x16, 0x73, 0xa2, 0x28, 0x52, 0x24, 0x25, 0x4a, 0x7c, 0x9d, - 0x45, 0x85, 0x79, 0xb4, 0x4d, 0x9a, 0xb2, 0xe4, 0x57, 0x38, 0x18, 0xa2, 0xad, 0x1f, 0x56, 0x84, - 0xa4, 0x60, 0x48, 0x72, 0x30, 0x28, 0xcb, 0x0e, 0xc9, 0x0c, 0x5a, 0x94, 0x2d, 0x11, 0x26, 0xd7, - 0x76, 0x50, 0xe1, 0x08, 0x2b, 0x42, 0xb2, 0x7f, 0x38, 0xd6, 0x0e, 0x87, 0xa3, 0xde, 0xd5, 0x3d, - 0x3d, 0xc0, 0x60, 0xd1, 0xd8, 0x5d, 0x52, 0xf7, 0x6f, 0xa6, 0x32, 0xab, 0xb2, 0xba, 0x1e, 0x99, - 0x59, 0x59, 0x99, 0x59, 0xb0, 0xd4, 0x70, 0xe3, 0xcd, 0xf6, 0xfa, 0x74, 0x2d, 0x68, 0xce, 0x38, - 0x61, 0x23, 0x68, 0x85, 0xc1, 0x0d, 0xf6, 0xe3, 0xa9, 0x5a, 0x7d, 0x66, 0xfb, 0x99, 0x99, 0xd6, - 0x56, 0x63, 0xc6, 0x69, 0xb9, 0xd1, 0x8c, 0xd3, 0x6a, 0x79, 0x6e, 0xcd, 0x89, 0xdd, 0xc0, 0x9f, - 0xd9, 0x7e, 0xda, 0xf1, 0x5a, 0x9b, 0xce, 0xd3, 0x33, 0x0d, 0xe2, 0x93, 0xd0, 0x89, 0x49, 0x7d, - 0xba, 0x15, 0x06, 0x71, 0x80, 0x7e, 0x44, 0xb7, 0x36, 0x2d, 0x5b, 0x63, 0x3f, 0x5e, 0xa9, 0xd5, - 0xa7, 0xb7, 0x9f, 0x99, 0x6e, 0x6d, 0x35, 0xa6, 0x69, 0x6b, 0xd3, 0x46, 0x6b, 0xd3, 0xb2, 0xb5, - 0xd3, 0x4f, 0x19, 0x7d, 0x69, 0x04, 0x8d, 0x60, 0x86, 0x35, 0xba, 0xde, 0xde, 0x60, 0xff, 0xd8, - 0x1f, 0xf6, 0x8b, 0x13, 0x3b, 0x6d, 0x6f, 0x3d, 0x1f, 0x4d, 0xbb, 0x01, 0xed, 0xde, 0x4c, 0x2d, - 0x08, 0xc9, 0xcc, 0x76, 0x57, 0x87, 0x4e, 0x5f, 0xd4, 0x38, 0x64, 0x27, 0x26, 0x7e, 0xe4, 0x06, - 0x7e, 0xf4, 0x14, 0xed, 0x02, 0x09, 0xb7, 0x49, 0x68, 0x7e, 0x9e, 0x81, 0x90, 0xd5, 0xd2, 0xb3, - 0xba, 0xa5, 0xa6, 0x53, 0xdb, 0x74, 0x7d, 0x12, 0x76, 0x74, 0xf5, 0x26, 0x89, 0x9d, 0xac, 0x5a, - 0x33, 0xbd, 0x6a, 0x85, 0x6d, 0x3f, 0x76, 0x9b, 0xa4, 0xab, 0xc2, 0x3b, 0xf6, 0xab, 0x10, 0xd5, - 0x36, 0x49, 0xd3, 0xe9, 0xaa, 0xf7, 0x4c, 0xaf, 0x7a, 0xed, 0xd8, 0xf5, 0x66, 0x5c, 0x3f, 0x8e, - 0xe2, 0x30, 0x5d, 0xc9, 0xfe, 0x7b, 0x16, 0x8c, 0xce, 0x5e, 0xaf, 0xce, 0xb6, 0xe3, 0xcd, 0xf9, - 0xc0, 0xdf, 0x70, 0x1b, 0xe8, 0x39, 0x18, 0xae, 0x79, 0xed, 0x28, 0x26, 0xe1, 0x15, 0xa7, 0x49, - 0x26, 0xad, 0x33, 0xd6, 0x13, 0x95, 0xb9, 0xe3, 0x5f, 0xdd, 0x9d, 0x7a, 0xcb, 0xad, 0xdd, 0xa9, - 0xe1, 0x79, 0x0d, 0xc2, 0x26, 0x1e, 0xfa, 0x01, 0x18, 0x0a, 0x03, 0x8f, 0xcc, 0xe2, 0x2b, 0x93, - 0x05, 0x56, 0x65, 0x5c, 0x54, 0x19, 0xc2, 0xbc, 0x18, 0x4b, 0x38, 0x45, 0x6d, 0x85, 0xc1, 0x86, - 0xeb, 0x91, 0xc9, 0x62, 0x12, 0x75, 0x95, 0x17, 0x63, 0x09, 0xb7, 0x3f, 0x5b, 0x80, 0xf1, 0xd9, - 0x56, 0xeb, 0x22, 0x71, 0xbc, 0x78, 0xb3, 0x1a, 0x3b, 0x71, 0x3b, 0x42, 0x0d, 0x18, 0x8c, 0xd8, - 0x2f, 0xd1, 0xb7, 0x15, 0x51, 0x7b, 0x90, 0xc3, 0x6f, 0xef, 0x4e, 0xfd, 0x68, 0xd6, 0x8a, 0x6e, - 0xb8, 0x71, 0xd0, 0x8a, 0x9e, 0x22, 0x7e, 0xc3, 0xf5, 0x09, 0x1b, 0x97, 0x4d, 0xd6, 0xea, 0xb4, - 0xd9, 0xf8, 0x7c, 0x50, 0x27, 0x58, 0x34, 0x4f, 0xfb, 0xd9, 0x24, 0x51, 0xe4, 0x34, 0x48, 0xfa, - 0x93, 0x96, 0x79, 0x31, 0x96, 0x70, 0x14, 0x02, 0xf2, 0x9c, 0x28, 0x5e, 0x0b, 0x1d, 0x3f, 0x72, - 0xe9, 0x92, 0x5e, 0x73, 0x9b, 0xfc, 0xeb, 0x86, 0xcf, 0xfe, 0x7f, 0xd3, 0x7c, 0x62, 0xa6, 0xcd, - 0x89, 0xd1, 0xfb, 0x80, 0xae, 0x9b, 0xe9, 0xed, 0xa7, 0xa7, 0x69, 0x8d, 0xb9, 0x07, 0x6e, 0xed, - 0x4e, 0xa1, 0xa5, 0xae, 0x96, 0x70, 0x46, 0xeb, 0xf6, 0x9f, 0x14, 0x00, 0x66, 0x5b, 0xad, 0xd5, - 0x30, 0xb8, 0x41, 0x6a, 0x31, 0x7a, 0x2f, 0x94, 0x69, 0x53, 0x75, 0x27, 0x76, 0xd8, 0xc0, 0x0c, - 0x9f, 0xfd, 0xc1, 0xfe, 0x08, 0xaf, 0xac, 0xd3, 0xfa, 0xcb, 0x24, 0x76, 0xe6, 0x90, 0xf8, 0x40, - 0xd0, 0x65, 0x58, 0xb5, 0x8a, 0x7c, 0x18, 0x88, 0x5a, 0xa4, 0xc6, 0x06, 0x63, 0xf8, 0xec, 0xd2, - 0xf4, 0x61, 0x76, 0xfa, 0xb4, 0xee, 0x79, 0xb5, 0x45, 0x6a, 0x73, 0x23, 0x82, 0xf2, 0x00, 0xfd, - 0x87, 0x19, 0x1d, 0xb4, 0xad, 0x26, 0x9a, 0x0f, 0xe4, 0x95, 0xdc, 0x28, 0xb2, 0x56, 0xe7, 0xc6, - 0x92, 0x0b, 0x47, 0xce, 0xbb, 0xfd, 0x4d, 0x0b, 0xc6, 0x34, 0xf2, 0x92, 0x1b, 0xc5, 0xe8, 0x27, - 0xbb, 0x06, 0x77, 0xba, 0xbf, 0xc1, 0xa5, 0xb5, 0xd9, 0xd0, 0x1e, 0x13, 0xc4, 0xca, 0xb2, 0xc4, - 0x18, 0xd8, 0x26, 0x94, 0xdc, 0x98, 0x34, 0xa3, 0xc9, 0xc2, 0x99, 0xe2, 0x13, 0xc3, 0x67, 0x2f, - 0xe6, 0xf5, 0x9d, 0x73, 0xa3, 0x82, 0x68, 0x69, 0x91, 0x36, 0x8f, 0x39, 0x15, 0xfb, 0xaf, 0x47, - 0xcd, 0xef, 0xa3, 0x03, 0x8e, 0x9e, 0x86, 0xe1, 0x28, 0x68, 0x87, 0x35, 0x82, 0x49, 0x2b, 0xa0, - 0x1b, 0xab, 0x48, 0x97, 0x3b, 0xdd, 0xf0, 0x55, 0x5d, 0x8c, 0x4d, 0x1c, 0xf4, 0x49, 0x0b, 0x46, - 0xea, 0x24, 0x8a, 0x5d, 0x9f, 0xd1, 0x97, 0x9d, 0x5f, 0x3b, 0x74, 0xe7, 0x65, 0xe1, 0x82, 0x6e, - 0x7c, 0xee, 0x84, 0xf8, 0x90, 0x11, 0xa3, 0x30, 0xc2, 0x09, 0xfa, 0x94, 0x71, 0xd5, 0x49, 0x54, - 0x0b, 0xdd, 0x16, 0xfd, 0x2f, 0x58, 0x8b, 0x62, 0x5c, 0x0b, 0x1a, 0x84, 0x4d, 0x3c, 0xe4, 0x43, - 0x89, 0x32, 0xa6, 0x68, 0x72, 0x80, 0xf5, 0x7f, 0xf1, 0x70, 0xfd, 0x17, 0x83, 0x4a, 0x79, 0x9e, - 0x1e, 0x7d, 0xfa, 0x2f, 0xc2, 0x9c, 0x0c, 0xfa, 0x84, 0x05, 0x93, 0x82, 0x71, 0x62, 0xc2, 0x07, - 0xf4, 0xfa, 0xa6, 0x1b, 0x13, 0xcf, 0x8d, 0xe2, 0xc9, 0x12, 0xeb, 0xc3, 0x4c, 0x7f, 0x6b, 0xeb, - 0x42, 0x18, 0xb4, 0x5b, 0x97, 0x5d, 0xbf, 0x3e, 0x77, 0x46, 0x50, 0x9a, 0x9c, 0xef, 0xd1, 0x30, - 0xee, 0x49, 0x12, 0x7d, 0xda, 0x82, 0xd3, 0xbe, 0xd3, 0x24, 0x51, 0xcb, 0xa1, 0x53, 0xcb, 0xc1, - 0x73, 0x9e, 0x53, 0xdb, 0x62, 0x3d, 0x1a, 0xbc, 0xb3, 0x1e, 0xd9, 0xa2, 0x47, 0xa7, 0xaf, 0xf4, - 0x6c, 0x1a, 0xef, 0x41, 0x16, 0xfd, 0xaa, 0x05, 0x13, 0x41, 0xd8, 0xda, 0x74, 0x7c, 0x52, 0x97, - 0xd0, 0x68, 0x72, 0x88, 0x6d, 0xbd, 0xf7, 0x1c, 0x6e, 0x8a, 0x56, 0xd2, 0xcd, 0x2e, 0x07, 0xbe, - 0x1b, 0x07, 0x61, 0x95, 0xc4, 0xb1, 0xeb, 0x37, 0xa2, 0xb9, 0x93, 0xb7, 0x76, 0xa7, 0x26, 0xba, - 0xb0, 0x70, 0x77, 0x7f, 0xd0, 0x4f, 0xc1, 0x70, 0xd4, 0xf1, 0x6b, 0xd7, 0x5d, 0xbf, 0x1e, 0xdc, - 0x8c, 0x26, 0xcb, 0x79, 0x6c, 0xdf, 0xaa, 0x6a, 0x50, 0x6c, 0x40, 0x4d, 0x00, 0x9b, 0xd4, 0xb2, - 0x27, 0x4e, 0x2f, 0xa5, 0x4a, 0xde, 0x13, 0xa7, 0x17, 0xd3, 0x1e, 0x64, 0xd1, 0xcf, 0x5b, 0x30, - 0x1a, 0xb9, 0x0d, 0xdf, 0x89, 0xdb, 0x21, 0xb9, 0x4c, 0x3a, 0xd1, 0x24, 0xb0, 0x8e, 0x5c, 0x3a, - 0xe4, 0xa8, 0x18, 0x4d, 0xce, 0x9d, 0x14, 0x7d, 0x1c, 0x35, 0x4b, 0x23, 0x9c, 0xa4, 0x9b, 0xb5, - 0xd1, 0xf4, 0xb2, 0x1e, 0xce, 0x77, 0xa3, 0xe9, 0x45, 0xdd, 0x93, 0x24, 0xfa, 0x71, 0x38, 0xc6, - 0x8b, 0xd4, 0xc8, 0x46, 0x93, 0x23, 0x8c, 0xd1, 0x9e, 0xb8, 0xb5, 0x3b, 0x75, 0xac, 0x9a, 0x82, - 0xe1, 0x2e, 0x6c, 0xf4, 0x2a, 0x4c, 0xb5, 0x48, 0xd8, 0x74, 0xe3, 0x15, 0xdf, 0xeb, 0x48, 0xf6, - 0x5d, 0x0b, 0x5a, 0xa4, 0x2e, 0xba, 0x13, 0x4d, 0x8e, 0x9e, 0xb1, 0x9e, 0x28, 0xcf, 0xbd, 0x4d, - 0x74, 0x73, 0x6a, 0x75, 0x6f, 0x74, 0xbc, 0x5f, 0x7b, 0xe8, 0x2b, 0x16, 0x9c, 0x36, 0xb8, 0x6c, - 0x95, 0x84, 0xdb, 0x6e, 0x8d, 0xcc, 0xd6, 0x6a, 0x41, 0xdb, 0x8f, 0xa3, 0xc9, 0x31, 0x36, 0x8c, - 0xeb, 0x47, 0xc1, 0xf3, 0x93, 0xa4, 0xf4, 0xba, 0xec, 0x89, 0x12, 0xe1, 0x3d, 0x7a, 0x6a, 0xff, - 0x41, 0x01, 0x8e, 0xa5, 0x35, 0x00, 0xf4, 0x8f, 0x2c, 0x18, 0xbf, 0x71, 0x33, 0x5e, 0x0b, 0xb6, - 0x88, 0x1f, 0xcd, 0x75, 0x28, 0x9f, 0x66, 0xb2, 0x6f, 0xf8, 0x6c, 0x2d, 0x5f, 0x5d, 0x63, 0xfa, - 0x52, 0x92, 0xca, 0x39, 0x3f, 0x0e, 0x3b, 0x73, 0x0f, 0x8a, 0x6f, 0x1a, 0xbf, 0x74, 0x7d, 0xcd, - 0x84, 0xe2, 0x74, 0xa7, 0x4e, 0x7f, 0xcc, 0x82, 0x13, 0x59, 0x4d, 0xa0, 0x63, 0x50, 0xdc, 0x22, - 0x1d, 0xae, 0x09, 0x63, 0xfa, 0x13, 0xbd, 0x0c, 0xa5, 0x6d, 0xc7, 0x6b, 0x13, 0xa1, 0xa6, 0x5d, - 0x38, 0xdc, 0x87, 0xa8, 0x9e, 0x61, 0xde, 0xea, 0x0f, 0x17, 0x9e, 0xb7, 0xec, 0x3f, 0x2a, 0xc2, - 0xb0, 0x31, 0x69, 0x77, 0x41, 0xf5, 0x0c, 0x12, 0xaa, 0xe7, 0x72, 0x6e, 0xeb, 0xad, 0xa7, 0xee, - 0x79, 0x33, 0xa5, 0x7b, 0xae, 0xe4, 0x47, 0x72, 0x4f, 0xe5, 0x13, 0xc5, 0x50, 0x09, 0x5a, 0xf4, - 0x88, 0x46, 0x75, 0x98, 0x81, 0x3c, 0xa6, 0x70, 0x45, 0x36, 0x37, 0x37, 0x7a, 0x6b, 0x77, 0xaa, - 0xa2, 0xfe, 0x62, 0x4d, 0xc8, 0xfe, 0x86, 0x05, 0x27, 0x8c, 0x3e, 0xce, 0x07, 0x7e, 0x9d, 0x1d, - 0x34, 0xd0, 0x19, 0x18, 0x88, 0x3b, 0x2d, 0x79, 0x0c, 0x54, 0x23, 0xb5, 0xd6, 0x69, 0x11, 0xcc, - 0x20, 0xf7, 0xfb, 0x29, 0xe9, 0xd3, 0x16, 0x3c, 0x90, 0xcd, 0x60, 0xd0, 0xe3, 0x30, 0xc8, 0x6d, - 0x00, 0xe2, 0xeb, 0xf4, 0x94, 0xb0, 0x52, 0x2c, 0xa0, 0x68, 0x06, 0x2a, 0x4a, 0xe0, 0x89, 0x6f, - 0x9c, 0x10, 0xa8, 0x15, 0x2d, 0x25, 0x35, 0x0e, 0x1d, 0x34, 0xfa, 0x47, 0xa8, 0xa0, 0x6a, 0xd0, - 0xd8, 0xa1, 0x99, 0x41, 0xec, 0xaf, 0x5b, 0xf0, 0xd6, 0x7e, 0xd8, 0xde, 0xd1, 0xf5, 0xb1, 0x0a, - 0x27, 0xeb, 0x64, 0xc3, 0x69, 0x7b, 0x71, 0x92, 0xa2, 0xe8, 0xf4, 0x23, 0xa2, 0xf2, 0xc9, 0x85, - 0x2c, 0x24, 0x9c, 0x5d, 0xd7, 0xfe, 0x4f, 0x16, 0x3b, 0xae, 0xcb, 0xcf, 0xba, 0x0b, 0x47, 0x27, - 0x3f, 0x79, 0x74, 0x5a, 0xcc, 0x6d, 0x9b, 0xf6, 0x38, 0x3b, 0x7d, 0xc2, 0x82, 0xd3, 0x06, 0xd6, - 0xb2, 0x13, 0xd7, 0x36, 0xcf, 0xed, 0xb4, 0x42, 0x12, 0x45, 0x74, 0x49, 0x3d, 0x62, 0xb0, 0xe3, - 0xb9, 0x61, 0xd1, 0x42, 0xf1, 0x32, 0xe9, 0x70, 0xde, 0xfc, 0x24, 0x94, 0xf9, 0x9e, 0x0b, 0x42, - 0x31, 0x49, 0xea, 0xdb, 0x56, 0x44, 0x39, 0x56, 0x18, 0xc8, 0x86, 0x41, 0xc6, 0x73, 0x29, 0x0f, - 0xa2, 0x6a, 0x02, 0xd0, 0x79, 0xbf, 0xc6, 0x4a, 0xb0, 0x80, 0xd8, 0x51, 0xa2, 0x3b, 0xab, 0x21, - 0x61, 0xeb, 0xa1, 0x7e, 0xde, 0x25, 0x5e, 0x3d, 0xa2, 0xc7, 0x3a, 0xc7, 0xf7, 0x83, 0x58, 0x9c, - 0xd0, 0x8c, 0x63, 0xdd, 0xac, 0x2e, 0xc6, 0x26, 0x0e, 0x25, 0xea, 0x39, 0xeb, 0xc4, 0xe3, 0x23, - 0x2a, 0x88, 0x2e, 0xb1, 0x12, 0x2c, 0x20, 0xf6, 0xad, 0x02, 0x3b, 0x40, 0x2a, 0x8e, 0x46, 0xee, - 0x86, 0xf5, 0x21, 0x4c, 0x88, 0x80, 0xd5, 0xfc, 0xf8, 0x31, 0xe9, 0x6d, 0x81, 0x78, 0x2d, 0x25, - 0x05, 0x70, 0xae, 0x54, 0xf7, 0xb6, 0x42, 0x7c, 0xa0, 0x08, 0x53, 0xc9, 0x0a, 0x5d, 0x42, 0x84, - 0x1e, 0x79, 0x0d, 0x42, 0x69, 0x5b, 0x9d, 0x81, 0x8f, 0x4d, 0xbc, 0x1e, 0x7c, 0xb8, 0x70, 0x94, - 0x7c, 0xd8, 0x14, 0x13, 0xc5, 0x7d, 0xc4, 0xc4, 0xe3, 0x6a, 0xd4, 0x07, 0x52, 0x3c, 0x2f, 0x29, - 0x2a, 0xcf, 0xc0, 0x40, 0x14, 0x93, 0xd6, 0x64, 0x29, 0xc9, 0x66, 0xab, 0x31, 0x69, 0x61, 0x06, - 0x41, 0x3f, 0x0a, 0xe3, 0xb1, 0x13, 0x36, 0x48, 0x1c, 0x92, 0x6d, 0x97, 0xd9, 0x75, 0xd9, 0x79, - 0xb6, 0x32, 0x77, 0x9c, 0x6a, 0x5d, 0x6b, 0x0c, 0x84, 0x25, 0x08, 0xa7, 0x71, 0xed, 0xff, 0x56, - 0x80, 0x07, 0x93, 0x53, 0xa0, 0x05, 0xe3, 0x8f, 0x25, 0x04, 0xe3, 0xdb, 0x4d, 0xc1, 0x78, 0x7b, - 0x77, 0xea, 0xa1, 0x1e, 0xd5, 0xbe, 0x6b, 0xe4, 0x26, 0xba, 0x90, 0x9a, 0x84, 0x99, 0x2e, 0x2b, - 0xeb, 0x23, 0x3d, 0xbe, 0x31, 0x35, 0x4b, 0x8f, 0xc3, 0x60, 0x48, 0x9c, 0x28, 0xf0, 0xc5, 0x3c, - 0xa9, 0xd9, 0xc4, 0xac, 0x14, 0x0b, 0xa8, 0xfd, 0xb5, 0x4a, 0x7a, 0xb0, 0x2f, 0x70, 0x5b, 0x75, - 0x10, 0x22, 0x17, 0x06, 0xd8, 0xa9, 0x8d, 0x73, 0x96, 0xcb, 0x87, 0xdb, 0x85, 0x54, 0x8a, 0xa8, - 0xa6, 0xe7, 0xca, 0x74, 0xd6, 0x68, 0x11, 0x66, 0x24, 0xd0, 0x0e, 0x94, 0x6b, 0xf2, 0x30, 0x55, - 0xc8, 0xc3, 0xec, 0x28, 0x8e, 0x52, 0x9a, 0xe2, 0x08, 0x65, 0xf7, 0xea, 0x04, 0xa6, 0xa8, 0x21, - 0x02, 0xc5, 0x86, 0x1b, 0x8b, 0x69, 0x3d, 0xe4, 0x71, 0xf9, 0x82, 0x6b, 0x7c, 0xe2, 0x10, 0x95, - 0x41, 0x17, 0xdc, 0x18, 0xd3, 0xf6, 0xd1, 0x47, 0x2c, 0x18, 0x8e, 0x6a, 0xcd, 0xd5, 0x30, 0xd8, - 0x76, 0xeb, 0x24, 0x14, 0x3a, 0xe6, 0x21, 0x39, 0x5b, 0x75, 0x7e, 0x59, 0x36, 0xa8, 0xe9, 0x72, - 0xf3, 0x85, 0x86, 0x60, 0x93, 0x2e, 0x3d, 0x7b, 0x3d, 0x28, 0xbe, 0x7d, 0x81, 0xd4, 0xd8, 0x8e, - 0x93, 0x67, 0x66, 0xb6, 0x52, 0x0e, 0xad, 0x73, 0x2f, 0xb4, 0x6b, 0x5b, 0x74, 0xbf, 0xe9, 0x0e, - 0x3d, 0x74, 0x6b, 0x77, 0xea, 0xc1, 0xf9, 0x6c, 0x9a, 0xb8, 0x57, 0x67, 0xd8, 0x80, 0xb5, 0xda, - 0x9e, 0x87, 0xc9, 0xab, 0x6d, 0xc2, 0x2c, 0x62, 0x39, 0x0c, 0xd8, 0xaa, 0x6e, 0x30, 0x35, 0x60, - 0x06, 0x04, 0x9b, 0x74, 0xd1, 0xab, 0x30, 0xd8, 0x74, 0xe2, 0xd0, 0xdd, 0x11, 0x66, 0xb0, 0x43, - 0x9e, 0x82, 0x96, 0x59, 0x5b, 0x9a, 0x38, 0x13, 0xf4, 0xbc, 0x10, 0x0b, 0x42, 0xa8, 0x09, 0xa5, - 0x26, 0x09, 0x1b, 0x64, 0xb2, 0x9c, 0x87, 0xc9, 0x7f, 0x99, 0x36, 0xa5, 0x09, 0x56, 0xa8, 0x72, - 0xc5, 0xca, 0x30, 0xa7, 0x82, 0x5e, 0x86, 0x72, 0x44, 0x3c, 0x52, 0xa3, 0xea, 0x51, 0x85, 0x51, - 0x7c, 0xa6, 0x4f, 0x55, 0x91, 0xea, 0x25, 0x55, 0x51, 0x95, 0x6f, 0x30, 0xf9, 0x0f, 0xab, 0x26, - 0xe9, 0x00, 0xb6, 0xbc, 0x76, 0xc3, 0xf5, 0x27, 0x21, 0x8f, 0x01, 0x5c, 0x65, 0x6d, 0xa5, 0x06, - 0x90, 0x17, 0x62, 0x41, 0xc8, 0xfe, 0xaf, 0x16, 0xa0, 0x24, 0x53, 0xbb, 0x0b, 0x3a, 0xf1, 0xab, - 0x49, 0x9d, 0x78, 0x29, 0x4f, 0xa5, 0xa5, 0x87, 0x5a, 0xfc, 0x5b, 0x15, 0x48, 0x89, 0x83, 0x2b, - 0x24, 0x8a, 0x49, 0xfd, 0x4d, 0x16, 0xfe, 0x26, 0x0b, 0x7f, 0x93, 0x85, 0x2b, 0x16, 0xbe, 0x9e, - 0x62, 0xe1, 0xef, 0x34, 0x76, 0xbd, 0xf6, 0x3d, 0x78, 0x45, 0x39, 0x27, 0x98, 0x3d, 0x30, 0x10, - 0x28, 0x27, 0xb8, 0x54, 0x5d, 0xb9, 0x92, 0xc9, 0xb3, 0x5f, 0x49, 0xf2, 0xec, 0xc3, 0x92, 0xf8, - 0x9b, 0xc0, 0xa5, 0xbf, 0x62, 0xc1, 0xdb, 0x92, 0xdc, 0x4b, 0xae, 0x9c, 0xc5, 0x86, 0x1f, 0x84, - 0x64, 0xc1, 0xdd, 0xd8, 0x20, 0x21, 0xf1, 0x6b, 0x24, 0x52, 0xb6, 0x1d, 0xab, 0x97, 0x6d, 0x07, - 0x3d, 0x0b, 0x23, 0x37, 0xa2, 0xc0, 0x5f, 0x0d, 0x5c, 0x5f, 0xb0, 0x20, 0x7a, 0xe2, 0x38, 0x76, - 0x6b, 0x77, 0x6a, 0x84, 0x8e, 0xa8, 0x2c, 0xc7, 0x09, 0x2c, 0x34, 0x0f, 0x13, 0x37, 0x5e, 0x5d, - 0x75, 0x62, 0xc3, 0x9a, 0x20, 0xcf, 0xfd, 0xec, 0x3e, 0xea, 0xd2, 0x8b, 0x29, 0x20, 0xee, 0xc6, - 0xb7, 0xff, 0x6e, 0x01, 0x4e, 0xa5, 0x3e, 0x24, 0xf0, 0xbc, 0xa0, 0x1d, 0xd3, 0x33, 0x11, 0xfa, - 0xbc, 0x05, 0xc7, 0x9a, 0x49, 0x83, 0x45, 0x24, 0xcc, 0xdd, 0x3f, 0x91, 0x9b, 0x8c, 0x48, 0x59, - 0x44, 0xe6, 0x26, 0xc5, 0x08, 0x1d, 0x4b, 0x01, 0x22, 0xdc, 0xd5, 0x17, 0xf4, 0x32, 0x54, 0x9a, - 0xce, 0xce, 0xd5, 0x56, 0xdd, 0x89, 0xe5, 0x71, 0xb4, 0xb7, 0x15, 0xa1, 0x1d, 0xbb, 0xde, 0x34, - 0xf7, 0x6a, 0x99, 0x5e, 0xf4, 0xe3, 0x95, 0xb0, 0x1a, 0x87, 0xae, 0xdf, 0xe0, 0x46, 0xce, 0x65, - 0xd9, 0x0c, 0xd6, 0x2d, 0xda, 0x9f, 0xb3, 0xd2, 0x42, 0x4a, 0x8d, 0x4e, 0xe8, 0xc4, 0xa4, 0xd1, - 0x41, 0xef, 0x83, 0x12, 0x3d, 0x37, 0xca, 0x51, 0xb9, 0x9e, 0xa7, 0xe4, 0x34, 0x66, 0x42, 0x0b, - 0x51, 0xfa, 0x2f, 0xc2, 0x9c, 0xa8, 0xfd, 0xf9, 0x4a, 0x5a, 0x59, 0x60, 0x77, 0xf3, 0x67, 0x01, - 0x1a, 0xc1, 0x1a, 0x69, 0xb6, 0x3c, 0x3a, 0x2c, 0x16, 0xbb, 0xe0, 0x51, 0xa6, 0x92, 0x0b, 0x0a, - 0x82, 0x0d, 0x2c, 0xf4, 0x0b, 0x16, 0x40, 0x43, 0xae, 0x79, 0xa9, 0x08, 0x5c, 0xcd, 0xf3, 0x73, - 0xf4, 0x8e, 0xd2, 0x7d, 0x51, 0x04, 0xb1, 0x41, 0x1c, 0xfd, 0xac, 0x05, 0xe5, 0x58, 0x76, 0x9f, - 0x8b, 0xc6, 0xb5, 0x3c, 0x7b, 0x22, 0x3f, 0x5a, 0xeb, 0x44, 0x6a, 0x48, 0x14, 0x5d, 0xf4, 0x73, - 0x16, 0x40, 0xd4, 0xf1, 0x6b, 0xab, 0x81, 0xe7, 0xd6, 0x3a, 0x42, 0x62, 0x5e, 0xcb, 0xd5, 0x9c, - 0xa3, 0x5a, 0x9f, 0x1b, 0xa3, 0xa3, 0xa1, 0xff, 0x63, 0x83, 0x32, 0x7a, 0x3f, 0x94, 0x23, 0xb1, - 0xdc, 0x84, 0x8c, 0x5c, 0xcb, 0xd7, 0xa8, 0xc4, 0xdb, 0x16, 0xec, 0x55, 0xfc, 0xc3, 0x8a, 0x26, - 0xfa, 0x8c, 0x05, 0xe3, 0xad, 0xa4, 0x99, 0x50, 0x88, 0xc3, 0xfc, 0x78, 0x40, 0xca, 0x0c, 0xc9, - 0xad, 0x2d, 0xa9, 0x42, 0x9c, 0xee, 0x05, 0xe5, 0x80, 0x7a, 0x05, 0xaf, 0xb4, 0xb8, 0xc9, 0x72, - 0x48, 0x73, 0xc0, 0x0b, 0x69, 0x20, 0xee, 0xc6, 0x47, 0xab, 0x70, 0x82, 0xf6, 0xae, 0xc3, 0xd5, - 0x4f, 0x29, 0x5e, 0x22, 0x26, 0x0c, 0xcb, 0x73, 0x0f, 0x8b, 0x15, 0xc2, 0xee, 0x3a, 0xd2, 0x38, - 0x38, 0xb3, 0x26, 0xfa, 0x23, 0x0b, 0x1e, 0x76, 0x99, 0x18, 0x30, 0x0d, 0xf6, 0x5a, 0x22, 0x88, - 0x8b, 0x76, 0x92, 0x2b, 0xaf, 0xe8, 0x25, 0x7e, 0xe6, 0xde, 0x2a, 0xbe, 0xe0, 0xe1, 0xc5, 0x3d, - 0xba, 0x84, 0xf7, 0xec, 0x30, 0xfa, 0x21, 0x18, 0x95, 0xfb, 0x62, 0x95, 0xb2, 0x60, 0x26, 0x68, - 0x2b, 0x73, 0x13, 0xb7, 0x76, 0xa7, 0x46, 0xd7, 0x4c, 0x00, 0x4e, 0xe2, 0xd9, 0xff, 0xba, 0x98, - 0xb8, 0x25, 0x52, 0x36, 0x4c, 0xc6, 0x6e, 0x6a, 0xd2, 0xfe, 0x23, 0xb9, 0x67, 0xae, 0xec, 0x46, - 0x59, 0x97, 0x34, 0xbb, 0x51, 0x45, 0x11, 0x36, 0x88, 0x53, 0xa5, 0x74, 0xc2, 0x49, 0x5b, 0x4a, - 0x05, 0x07, 0x7c, 0x39, 0xcf, 0x2e, 0x75, 0xdf, 0xe9, 0x9d, 0x12, 0x5d, 0x9b, 0xe8, 0x02, 0xe1, - 0xee, 0x2e, 0xa1, 0x9f, 0x86, 0x4a, 0xa8, 0x3c, 0x5b, 0x8a, 0x79, 0x1c, 0xd5, 0xe4, 0xb2, 0x11, - 0xdd, 0x51, 0x17, 0x40, 0xda, 0x87, 0x45, 0x53, 0xb4, 0xff, 0x30, 0x79, 0x31, 0x66, 0xf0, 0x8e, - 0x3e, 0x2e, 0xfd, 0x3e, 0x69, 0xc1, 0x70, 0x18, 0x78, 0x9e, 0xeb, 0x37, 0x28, 0x9f, 0x13, 0xc2, - 0xfa, 0xdd, 0x47, 0x22, 0x2f, 0x05, 0x43, 0x63, 0x9a, 0x35, 0xd6, 0x34, 0xb1, 0xd9, 0x01, 0xfb, - 0x9b, 0x16, 0x4c, 0xf6, 0xe2, 0xc7, 0x88, 0xc0, 0x43, 0x92, 0xd9, 0xa8, 0xa1, 0x58, 0xf1, 0x17, - 0x88, 0x47, 0x94, 0xd9, 0xbc, 0x3c, 0xf7, 0x98, 0xf8, 0xcc, 0x87, 0x56, 0x7b, 0xa3, 0xe2, 0xbd, - 0xda, 0x41, 0x2f, 0xc1, 0x31, 0xe3, 0xbb, 0x22, 0x35, 0x30, 0x95, 0xb9, 0x69, 0xaa, 0x00, 0xcd, - 0xa6, 0x60, 0xb7, 0x77, 0xa7, 0x1e, 0x48, 0x97, 0x09, 0x81, 0xd1, 0xd5, 0x8e, 0xfd, 0x6b, 0x85, - 0xf4, 0x6c, 0x29, 0x59, 0xff, 0x86, 0xd5, 0x65, 0x4d, 0xf8, 0x89, 0xa3, 0x90, 0xaf, 0xcc, 0xee, - 0xa0, 0xdc, 0x30, 0x7a, 0xe3, 0xdc, 0xc3, 0x6b, 0x7b, 0xfb, 0xdf, 0x0c, 0xc0, 0x1e, 0x3d, 0xeb, - 0x43, 0x79, 0x3f, 0xf0, 0x3d, 0xea, 0xc7, 0x2d, 0x75, 0x61, 0xc6, 0xf7, 0x70, 0xfd, 0xa8, 0xc6, - 0x9e, 0x9f, 0x9f, 0x22, 0xee, 0x3a, 0xa2, 0xac, 0xe8, 0xc9, 0xab, 0x39, 0xf4, 0x05, 0x2b, 0x79, - 0xe5, 0xc7, 0x9d, 0x1a, 0xdd, 0x23, 0xeb, 0x93, 0x71, 0x8f, 0xc8, 0x3b, 0xa6, 0x6f, 0x9f, 0x7a, - 0xdd, 0x30, 0x4e, 0x03, 0x6c, 0xb8, 0xbe, 0xe3, 0xb9, 0xaf, 0xd1, 0xd3, 0x51, 0x89, 0x09, 0x78, - 0xa6, 0x31, 0x9d, 0x57, 0xa5, 0xd8, 0xc0, 0x38, 0xfd, 0xff, 0xc3, 0xb0, 0xf1, 0xe5, 0x19, 0x1e, - 0x2f, 0x27, 0x4c, 0x8f, 0x97, 0x8a, 0xe1, 0xa8, 0x72, 0xfa, 0x9d, 0x70, 0x2c, 0xdd, 0xc1, 0x83, - 0xd4, 0xb7, 0xff, 0xd7, 0x50, 0xfa, 0x0e, 0x6e, 0x8d, 0x84, 0x4d, 0xda, 0xb5, 0x37, 0x0d, 0x5b, - 0x6f, 0x1a, 0xb6, 0xde, 0x34, 0x6c, 0x99, 0x77, 0x13, 0xc2, 0x68, 0x33, 0x74, 0x97, 0x8c, 0x36, - 0x09, 0x33, 0x54, 0x39, 0x77, 0x33, 0x94, 0xfd, 0x91, 0x2e, 0xcb, 0xfd, 0x5a, 0x48, 0x08, 0x0a, - 0xa0, 0xe4, 0x07, 0x75, 0x22, 0x75, 0xdc, 0x4b, 0xf9, 0x28, 0x6c, 0x57, 0x82, 0xba, 0xe1, 0x2e, - 0x4e, 0xff, 0x45, 0x98, 0xd3, 0xb1, 0x3f, 0x3c, 0x08, 0x09, 0x75, 0x92, 0xcf, 0xfb, 0x0f, 0xc0, - 0x50, 0x48, 0x5a, 0xc1, 0x55, 0xbc, 0x24, 0x64, 0x99, 0x8e, 0xb6, 0xe1, 0xc5, 0x58, 0xc2, 0xa9, - 0xcc, 0x6b, 0x39, 0xf1, 0xa6, 0x10, 0x66, 0x4a, 0xe6, 0xad, 0x3a, 0xf1, 0x26, 0x66, 0x10, 0xf4, - 0x4e, 0x18, 0x8b, 0x13, 0x57, 0xe1, 0xe2, 0xca, 0xf7, 0x01, 0x81, 0x3b, 0x96, 0xbc, 0x28, 0xc7, - 0x29, 0x6c, 0xf4, 0x2a, 0x0c, 0x6c, 0x12, 0xaf, 0x29, 0xa6, 0xbe, 0x9a, 0x9f, 0xac, 0x61, 0xdf, - 0x7a, 0x91, 0x78, 0x4d, 0xce, 0x09, 0xe9, 0x2f, 0xcc, 0x48, 0xd1, 0x75, 0x5f, 0xd9, 0x6a, 0x47, - 0x71, 0xd0, 0x74, 0x5f, 0x93, 0x96, 0xce, 0x9f, 0xc8, 0x99, 0xf0, 0x65, 0xd9, 0x3e, 0x37, 0x29, - 0xa9, 0xbf, 0x58, 0x53, 0x66, 0xfd, 0xa8, 0xbb, 0x21, 0x5b, 0x32, 0x1d, 0x61, 0xb0, 0xcc, 0xbb, - 0x1f, 0x0b, 0xb2, 0x7d, 0xde, 0x0f, 0xf5, 0x17, 0x6b, 0xca, 0xa8, 0xa3, 0xf6, 0xdf, 0x30, 0xeb, - 0xc3, 0xd5, 0x9c, 0xfb, 0xc0, 0xf7, 0x5e, 0xe6, 0x3e, 0x7c, 0x0c, 0x4a, 0xb5, 0x4d, 0x27, 0x8c, - 0x27, 0x47, 0xd8, 0xa2, 0x51, 0xab, 0x78, 0x9e, 0x16, 0x62, 0x0e, 0x43, 0x8f, 0x40, 0x31, 0x24, - 0x1b, 0xcc, 0x3b, 0xd9, 0xf0, 0x8b, 0xc2, 0x64, 0x03, 0xd3, 0x72, 0xa5, 0x97, 0x8d, 0xf5, 0x74, - 0x98, 0xfb, 0x95, 0x42, 0x52, 0xb1, 0x4b, 0x8e, 0x0c, 0xdf, 0x0f, 0xb5, 0x76, 0x18, 0x49, 0x03, - 0x99, 0xb1, 0x1f, 0x58, 0x31, 0x96, 0x70, 0xf4, 0x41, 0x0b, 0x86, 0x6e, 0x44, 0x81, 0xef, 0x93, - 0x58, 0x08, 0xd1, 0x6b, 0x39, 0x0f, 0xd6, 0x25, 0xde, 0xba, 0xee, 0x83, 0x28, 0xc0, 0x92, 0x2e, - 0xed, 0x2e, 0xd9, 0xa9, 0x79, 0xed, 0x7a, 0x97, 0x33, 0xcc, 0x39, 0x5e, 0x8c, 0x25, 0x9c, 0xa2, - 0xba, 0x3e, 0x47, 0x1d, 0x48, 0xa2, 0x2e, 0xfa, 0x02, 0x55, 0xc0, 0xed, 0xdf, 0x28, 0xc3, 0xc9, - 0xcc, 0xed, 0x43, 0x55, 0x2e, 0xa6, 0xd4, 0x9c, 0x77, 0x3d, 0x22, 0xdd, 0xc0, 0x98, 0xca, 0x75, - 0x4d, 0x95, 0x62, 0x03, 0x03, 0xfd, 0x0c, 0x40, 0xcb, 0x09, 0x9d, 0x26, 0x51, 0x06, 0xec, 0x43, - 0x6b, 0x36, 0xb4, 0x1f, 0xab, 0xb2, 0x4d, 0x7d, 0x88, 0x57, 0x45, 0x11, 0x36, 0x48, 0xa2, 0xe7, - 0x60, 0x38, 0x24, 0x1e, 0x71, 0x22, 0xe6, 0xfe, 0x9e, 0x8e, 0xe5, 0xc1, 0x1a, 0x84, 0x4d, 0x3c, - 0xf4, 0xb8, 0xf2, 0x98, 0x4b, 0x79, 0x0e, 0x25, 0xbd, 0xe6, 0xd0, 0xa7, 0x2c, 0x18, 0xdb, 0x70, - 0x3d, 0xa2, 0xa9, 0x8b, 0xc8, 0x9b, 0x95, 0xc3, 0x7f, 0xe4, 0x79, 0xb3, 0x5d, 0xcd, 0x43, 0x13, - 0xc5, 0x11, 0x4e, 0x91, 0xa7, 0xd3, 0xbc, 0x4d, 0x42, 0xc6, 0x7c, 0x07, 0x93, 0xd3, 0x7c, 0x8d, - 0x17, 0x63, 0x09, 0x47, 0xb3, 0x30, 0xde, 0x72, 0xa2, 0x68, 0x3e, 0x24, 0x75, 0xe2, 0xc7, 0xae, - 0xe3, 0xf1, 0xb8, 0x98, 0xb2, 0x76, 0x27, 0x5f, 0x4d, 0x82, 0x71, 0x1a, 0x1f, 0xbd, 0x0b, 0x1e, - 0xe4, 0x16, 0xa2, 0x65, 0x37, 0x8a, 0x5c, 0xbf, 0xa1, 0x97, 0x81, 0x30, 0x94, 0x4d, 0x89, 0xa6, - 0x1e, 0x5c, 0xcc, 0x46, 0xc3, 0xbd, 0xea, 0xa3, 0x27, 0xa1, 0x1c, 0x6d, 0xb9, 0xad, 0xf9, 0xb0, - 0x1e, 0xb1, 0xdb, 0xa1, 0xb2, 0x36, 0xcb, 0x56, 0x45, 0x39, 0x56, 0x18, 0xa8, 0x06, 0x23, 0x7c, - 0x4a, 0xb8, 0xcb, 0x9f, 0xe0, 0xa0, 0x4f, 0xf5, 0x14, 0xe4, 0x22, 0x04, 0x76, 0x1a, 0x3b, 0x37, - 0xcf, 0xc9, 0xbb, 0x2a, 0x7e, 0xb5, 0x72, 0xcd, 0x68, 0x06, 0x27, 0x1a, 0x4d, 0x9e, 0xe9, 0x86, - 0xfb, 0x38, 0xd3, 0x3d, 0x07, 0xc3, 0x5b, 0xed, 0x75, 0x22, 0x46, 0x5e, 0x30, 0x36, 0xb5, 0xfa, - 0x2e, 0x6b, 0x10, 0x36, 0xf1, 0x98, 0xb7, 0x65, 0xcb, 0x15, 0xff, 0xa2, 0xc9, 0x51, 0xc3, 0xdb, - 0x72, 0x75, 0x51, 0x16, 0x63, 0x13, 0x87, 0x76, 0x8d, 0x8e, 0xc5, 0x1a, 0x89, 0x58, 0x30, 0x05, - 0x1d, 0x2e, 0xd5, 0xb5, 0xaa, 0x04, 0x60, 0x8d, 0x83, 0x56, 0xe1, 0x04, 0xfd, 0x53, 0x65, 0x21, - 0xc0, 0xd7, 0x1c, 0xcf, 0xad, 0x73, 0xd7, 0xbf, 0xf1, 0xa4, 0x7d, 0xb3, 0x9a, 0x81, 0x83, 0x33, - 0x6b, 0xda, 0x9f, 0x2d, 0x24, 0x2d, 0x27, 0x26, 0x0b, 0x43, 0x11, 0x65, 0x54, 0xf1, 0x35, 0x27, - 0x94, 0x0a, 0xcf, 0x21, 0x83, 0x9b, 0x44, 0xbb, 0xd7, 0x9c, 0xd0, 0x64, 0x79, 0x8c, 0x00, 0x96, - 0x94, 0xd0, 0x0d, 0x18, 0x88, 0x3d, 0x27, 0xa7, 0x68, 0x48, 0x83, 0xa2, 0x36, 0x64, 0x2d, 0xcd, - 0x46, 0x98, 0xd1, 0x40, 0x0f, 0xd3, 0xd3, 0xdb, 0xba, 0xbc, 0x69, 0x13, 0x07, 0xae, 0xf5, 0x08, - 0xb3, 0x52, 0xfb, 0x97, 0x47, 0x33, 0xa4, 0x8e, 0x52, 0x04, 0xd0, 0x59, 0x00, 0xba, 0x68, 0x56, - 0x43, 0xb2, 0xe1, 0xee, 0x08, 0x45, 0x4c, 0x71, 0xb6, 0x2b, 0x0a, 0x82, 0x0d, 0x2c, 0x59, 0xa7, - 0xda, 0xde, 0xa0, 0x75, 0x0a, 0xdd, 0x75, 0x38, 0x04, 0x1b, 0x58, 0xe8, 0x59, 0x18, 0x74, 0x9b, - 0x4e, 0x43, 0x39, 0x02, 0x3f, 0x4c, 0x59, 0xda, 0x22, 0x2b, 0xb9, 0xbd, 0x3b, 0x35, 0xa6, 0x3a, - 0xc4, 0x8a, 0xb0, 0xc0, 0x45, 0xbf, 0x66, 0xc1, 0x48, 0x2d, 0x68, 0x36, 0x03, 0x9f, 0x1f, 0x9f, - 0x85, 0x2d, 0xe0, 0xc6, 0x51, 0xa9, 0x49, 0xd3, 0xf3, 0x06, 0x31, 0x6e, 0x0c, 0x50, 0x61, 0x9b, - 0x26, 0x08, 0x27, 0x7a, 0x65, 0x72, 0xbe, 0xd2, 0x3e, 0x9c, 0xef, 0x37, 0x2d, 0x98, 0xe0, 0x75, - 0x8d, 0x53, 0xbd, 0x88, 0x50, 0x0c, 0x8e, 0xf8, 0xb3, 0xba, 0x0c, 0x1d, 0xca, 0xd8, 0xdb, 0x05, - 0xc7, 0xdd, 0x9d, 0x44, 0x17, 0x60, 0x62, 0x23, 0x08, 0x6b, 0xc4, 0x1c, 0x08, 0xc1, 0xb6, 0x55, - 0x43, 0xe7, 0xd3, 0x08, 0xb8, 0xbb, 0x0e, 0xba, 0x06, 0x0f, 0x18, 0x85, 0xe6, 0x38, 0x70, 0xce, - 0xfd, 0xa8, 0x68, 0xed, 0x81, 0xf3, 0x99, 0x58, 0xb8, 0x47, 0xed, 0x24, 0x93, 0xac, 0xf4, 0xc1, - 0x24, 0x5f, 0x81, 0x53, 0xb5, 0xee, 0x91, 0xd9, 0x8e, 0xda, 0xeb, 0x11, 0xe7, 0xe3, 0xe5, 0xb9, - 0xef, 0x13, 0x0d, 0x9c, 0x9a, 0xef, 0x85, 0x88, 0x7b, 0xb7, 0x81, 0xde, 0x07, 0xe5, 0x90, 0xb0, - 0x59, 0x89, 0x44, 0xb8, 0xde, 0x21, 0xad, 0x1d, 0x5a, 0x83, 0xe7, 0xcd, 0x6a, 0xc9, 0x24, 0x0a, - 0x22, 0xac, 0x28, 0xa2, 0x9b, 0x30, 0xd4, 0x72, 0xe2, 0xda, 0xa6, 0x08, 0xd2, 0x3b, 0xb4, 0x6d, - 0x5e, 0x11, 0x67, 0x57, 0x29, 0x46, 0xca, 0x03, 0x4e, 0x04, 0x4b, 0x6a, 0x54, 0x57, 0xab, 0x05, - 0xcd, 0x56, 0xe0, 0x13, 0x3f, 0x96, 0x42, 0x64, 0x8c, 0xdf, 0x77, 0xc8, 0x52, 0x6c, 0x60, 0x74, - 0xc9, 0x72, 0x8d, 0x36, 0x39, 0xb1, 0x87, 0x2c, 0x37, 0x5a, 0xeb, 0x55, 0x9f, 0x0a, 0x1b, 0x66, - 0x56, 0xbc, 0xee, 0xc6, 0x9b, 0x41, 0x3b, 0x96, 0xa7, 0x64, 0x21, 0xa8, 0x94, 0xb0, 0x59, 0xca, - 0xc0, 0xc1, 0x99, 0x35, 0xd3, 0x92, 0x75, 0xfc, 0xce, 0x24, 0xeb, 0xb1, 0x3e, 0x24, 0x6b, 0x15, - 0x4e, 0xb2, 0x1e, 0x08, 0x2d, 0x59, 0x1a, 0x2d, 0xa3, 0x49, 0xc4, 0x3a, 0xaf, 0xe2, 0x5b, 0x96, - 0xb2, 0x90, 0x70, 0x76, 0xdd, 0xd3, 0x3f, 0x06, 0x13, 0x5d, 0x4c, 0xee, 0x40, 0x06, 0xc9, 0x05, - 0x78, 0x20, 0x9b, 0x9d, 0x1c, 0xc8, 0x2c, 0xf9, 0x1b, 0x29, 0xbf, 0x74, 0xe3, 0x88, 0xd6, 0x87, - 0x89, 0xdb, 0x81, 0x22, 0xf1, 0xb7, 0x85, 0x74, 0x3d, 0x7f, 0xb8, 0x55, 0x7d, 0xce, 0xdf, 0xe6, - 0xdc, 0x90, 0xd9, 0xf1, 0xce, 0xf9, 0xdb, 0x98, 0xb6, 0x8d, 0x7e, 0xc9, 0x4a, 0x1c, 0x20, 0xb8, - 0x61, 0xfc, 0x3d, 0x47, 0x72, 0x26, 0xed, 0xfb, 0x4c, 0x61, 0xff, 0xdb, 0x02, 0x9c, 0xd9, 0xaf, - 0x91, 0x3e, 0x86, 0xef, 0x31, 0x18, 0x8c, 0x98, 0xa7, 0x89, 0x10, 0x57, 0xc3, 0x74, 0x17, 0x73, - 0xdf, 0x93, 0x57, 0xb0, 0x00, 0x21, 0x0f, 0x8a, 0x4d, 0xa7, 0x25, 0xec, 0xa5, 0x8b, 0x87, 0x8d, - 0xdf, 0xa3, 0xff, 0x1d, 0x6f, 0xd9, 0x69, 0xf1, 0x35, 0x6f, 0x14, 0x60, 0x4a, 0x06, 0xc5, 0x50, - 0x72, 0xc2, 0xd0, 0x91, 0x6e, 0x0d, 0x97, 0xf3, 0xa1, 0x37, 0x4b, 0x9b, 0xe4, 0xb7, 0xc2, 0x89, - 0x22, 0xcc, 0x89, 0xd9, 0x9f, 0x29, 0x27, 0x82, 0xbd, 0x98, 0xaf, 0x4a, 0x04, 0x83, 0xc2, 0x4c, - 0x6a, 0xe5, 0x1d, 0x36, 0xc9, 0xa3, 0xa9, 0x99, 0x05, 0x42, 0xe4, 0xa4, 0x10, 0xa4, 0xd0, 0xc7, - 0x2c, 0x96, 0xf9, 0x41, 0x46, 0xd0, 0x89, 0x53, 0xfd, 0xd1, 0x24, 0xa2, 0x30, 0xf3, 0x49, 0xc8, - 0x42, 0x6c, 0x52, 0x17, 0xd9, 0x6d, 0xd8, 0x69, 0xa6, 0x3b, 0xbb, 0x0d, 0x3b, 0x9d, 0x48, 0x38, - 0xda, 0xc9, 0xf0, 0x49, 0xc9, 0x21, 0x7b, 0x40, 0x1f, 0x5e, 0x28, 0x5f, 0xb0, 0x60, 0xc2, 0x4d, - 0x3b, 0x17, 0x88, 0x33, 0xf0, 0xf5, 0x7c, 0x6c, 0x9a, 0xdd, 0xbe, 0x0b, 0x4a, 0xd1, 0xe9, 0x02, - 0xe1, 0xee, 0xce, 0xa0, 0x3a, 0x0c, 0xb8, 0xfe, 0x46, 0x20, 0xd4, 0xbb, 0xb9, 0xc3, 0x75, 0x6a, - 0xd1, 0xdf, 0x08, 0xf4, 0x6e, 0xa6, 0xff, 0x30, 0x6b, 0x1d, 0x2d, 0xc1, 0x09, 0x19, 0xef, 0x73, - 0xd1, 0x8d, 0xe2, 0x20, 0xec, 0x2c, 0xb9, 0x4d, 0x37, 0x66, 0xaa, 0x59, 0x71, 0x6e, 0x92, 0x8a, - 0x37, 0x9c, 0x01, 0xc7, 0x99, 0xb5, 0xd0, 0x6b, 0x30, 0x24, 0x2f, 0xf4, 0xcb, 0x79, 0xd8, 0x13, - 0xba, 0xd7, 0xbf, 0x5a, 0x4c, 0x55, 0x71, 0xa3, 0x2f, 0x09, 0xa2, 0x8f, 0x5a, 0x30, 0xc6, 0x7f, - 0x5f, 0xec, 0xd4, 0x79, 0x88, 0x61, 0x25, 0x0f, 0xaf, 0xfd, 0x6a, 0xa2, 0xcd, 0x39, 0x74, 0x6b, - 0x77, 0x6a, 0x2c, 0x59, 0x86, 0x53, 0x74, 0xed, 0x7f, 0x3c, 0x02, 0xdd, 0x2e, 0x10, 0x49, 0x7f, - 0x07, 0xeb, 0x6e, 0xfb, 0x3b, 0xd0, 0x53, 0x65, 0xa4, 0x5d, 0x15, 0x72, 0xd8, 0x66, 0x82, 0xaa, - 0xbe, 0x86, 0xee, 0xf8, 0x35, 0xcc, 0x68, 0xa0, 0x36, 0x0c, 0xf2, 0xe4, 0x52, 0x42, 0x02, 0x1c, - 0xfe, 0xe6, 0xdb, 0x4c, 0x52, 0xa5, 0xcd, 0x5a, 0xbc, 0x14, 0x0b, 0x62, 0x68, 0x07, 0x86, 0x36, - 0xf9, 0x72, 0x14, 0x67, 0xbd, 0xe5, 0xc3, 0x8e, 0x6f, 0x62, 0x8d, 0xeb, 0xc5, 0x27, 0x0a, 0xb0, - 0x24, 0xc7, 0xdc, 0xeb, 0x0c, 0x07, 0x20, 0xce, 0x48, 0xf2, 0x8b, 0x96, 0xec, 0xdf, 0xfb, 0xe7, - 0xbd, 0x30, 0x12, 0x92, 0x5a, 0xe0, 0xd7, 0x5c, 0x8f, 0xd4, 0x67, 0xe5, 0x85, 0xd8, 0x41, 0x82, - 0xe4, 0x98, 0x35, 0x09, 0x1b, 0x6d, 0xe0, 0x44, 0x8b, 0x6c, 0x9f, 0xa9, 0xc0, 0x79, 0x3a, 0x21, - 0x44, 0x5c, 0x7c, 0x2c, 0xe5, 0x14, 0xa6, 0xcf, 0xda, 0xe4, 0xfb, 0x2c, 0x59, 0x86, 0x53, 0x74, - 0xd1, 0x4b, 0x00, 0xc1, 0x3a, 0xf7, 0xa1, 0x9b, 0x8d, 0xc5, 0x2d, 0xc8, 0x41, 0x3e, 0x75, 0x8c, - 0x07, 0xdb, 0xca, 0x16, 0xb0, 0xd1, 0x1a, 0xba, 0x0c, 0xc0, 0x77, 0xce, 0x5a, 0xa7, 0x25, 0x0f, - 0x84, 0x32, 0xca, 0x11, 0xaa, 0x0a, 0x72, 0x7b, 0x77, 0xaa, 0xdb, 0xe6, 0xcc, 0x1c, 0x85, 0x8c, - 0xea, 0xe8, 0xa7, 0x60, 0x28, 0x6a, 0x37, 0x9b, 0x8e, 0xba, 0x23, 0xc9, 0x31, 0x7c, 0x97, 0xb7, - 0x6b, 0x30, 0x46, 0x5e, 0x80, 0x25, 0x45, 0x74, 0x83, 0xb2, 0x78, 0xc1, 0xa1, 0xf8, 0x2e, 0xe2, - 0x1a, 0x0a, 0xb7, 0x04, 0xbe, 0x43, 0x9e, 0x62, 0x70, 0x06, 0xce, 0xed, 0xdd, 0xa9, 0x07, 0x92, - 0xe5, 0x4b, 0x81, 0x08, 0xa8, 0xcd, 0x6c, 0x13, 0x5d, 0x92, 0x79, 0xb4, 0xe8, 0x67, 0xcb, 0xf4, - 0x2e, 0x4f, 0xe8, 0x3c, 0x5a, 0xac, 0xb8, 0xf7, 0x98, 0x99, 0x95, 0xd1, 0x32, 0x1c, 0xaf, 0x05, - 0x7e, 0x1c, 0x06, 0x9e, 0xc7, 0x73, 0xec, 0xf1, 0xb3, 0x39, 0xbf, 0x43, 0x79, 0x48, 0x74, 0xfb, - 0xf8, 0x7c, 0x37, 0x0a, 0xce, 0xaa, 0x47, 0x75, 0xf2, 0xb4, 0x7c, 0x18, 0xcb, 0xe5, 0x7a, 0x3d, - 0xd1, 0xa6, 0xe0, 0x50, 0xca, 0xec, 0xbd, 0x8f, 0xa4, 0xf0, 0x93, 0x97, 0xac, 0x62, 0xc6, 0x9e, - 0x85, 0x11, 0xb2, 0x13, 0x93, 0xd0, 0x77, 0xbc, 0xab, 0x78, 0x49, 0x5e, 0x58, 0xb0, 0x8d, 0x79, - 0xce, 0x28, 0xc7, 0x09, 0x2c, 0x64, 0x2b, 0x2b, 0x99, 0x11, 0xb9, 0xce, 0xad, 0x64, 0xd2, 0x26, - 0x66, 0x7f, 0xa9, 0x98, 0xd0, 0x59, 0xef, 0xc9, 0x95, 0x2e, 0x4b, 0x91, 0x24, 0x73, 0x49, 0x31, - 0x80, 0x38, 0x8b, 0xe5, 0x49, 0x59, 0xa5, 0x48, 0x5a, 0x31, 0x09, 0xe1, 0x24, 0x5d, 0xb4, 0x05, - 0xa5, 0xcd, 0x20, 0x8a, 0xe5, 0x09, 0xed, 0x90, 0x87, 0xc1, 0x8b, 0x41, 0x14, 0x33, 0x45, 0x4b, - 0x7d, 0x36, 0x2d, 0x89, 0x30, 0xa7, 0x41, 0xcf, 0xfe, 0xd1, 0xa6, 0x13, 0xd6, 0xa3, 0x79, 0x96, - 0x67, 0x62, 0x80, 0x69, 0x58, 0x4a, 0x9f, 0xae, 0x6a, 0x10, 0x36, 0xf1, 0xec, 0xef, 0x58, 0x89, - 0x5b, 0xad, 0xeb, 0x2c, 0x68, 0x60, 0x9b, 0xf8, 0x94, 0x45, 0x99, 0x6e, 0x8a, 0x3f, 0x94, 0x0a, - 0xc1, 0x7e, 0x5b, 0xaf, 0x74, 0x98, 0x37, 0x69, 0x0b, 0xd3, 0xac, 0x09, 0xc3, 0xa3, 0xf1, 0x03, - 0x56, 0x32, 0x96, 0xbe, 0x90, 0xc7, 0xd1, 0xcd, 0xcc, 0x27, 0xb1, 0x6f, 0x58, 0xbe, 0xfd, 0x4b, - 0x16, 0x0c, 0xcd, 0x39, 0xb5, 0xad, 0x60, 0x63, 0x03, 0x3d, 0x09, 0xe5, 0x7a, 0x3b, 0x34, 0xc3, - 0xfa, 0x95, 0xb1, 0x6a, 0x41, 0x94, 0x63, 0x85, 0x41, 0x97, 0xfe, 0x86, 0x53, 0x93, 0x59, 0x25, - 0x8a, 0x7c, 0xe9, 0x9f, 0x67, 0x25, 0x58, 0x40, 0xe8, 0xf0, 0x37, 0x9d, 0x1d, 0x59, 0x39, 0x7d, - 0xa5, 0xb6, 0xac, 0x41, 0xd8, 0xc4, 0xb3, 0xff, 0x95, 0x05, 0x93, 0x73, 0x4e, 0xe4, 0xd6, 0x66, - 0xdb, 0xf1, 0xe6, 0x9c, 0x1b, 0xaf, 0xb7, 0x6b, 0x5b, 0x24, 0xe6, 0xd9, 0x47, 0x68, 0x2f, 0xdb, - 0x11, 0xdd, 0x81, 0xea, 0xc4, 0xac, 0x7a, 0x79, 0x55, 0x94, 0x63, 0x85, 0x81, 0x5e, 0x83, 0xe1, - 0x96, 0x13, 0x45, 0x37, 0x83, 0xb0, 0x8e, 0xc9, 0x46, 0x3e, 0xf9, 0x89, 0xaa, 0xa4, 0x16, 0x92, - 0x18, 0x93, 0x0d, 0xe1, 0xa0, 0xa2, 0xdb, 0xc7, 0x26, 0x31, 0xfb, 0x17, 0x2c, 0x38, 0x31, 0x47, - 0x9c, 0x90, 0x84, 0x2c, 0x9d, 0x91, 0xfa, 0x10, 0xf4, 0x2a, 0x94, 0x63, 0x5a, 0x42, 0x7b, 0x64, - 0xe5, 0xdb, 0x23, 0xe6, 0x5a, 0xb2, 0x26, 0x1a, 0xc7, 0x8a, 0x8c, 0xfd, 0x49, 0x0b, 0x4e, 0x65, - 0xf5, 0x65, 0xde, 0x0b, 0xda, 0xf5, 0x7b, 0xd1, 0xa1, 0xbf, 0x63, 0xc1, 0x08, 0xbb, 0xae, 0x5f, - 0x20, 0xb1, 0xe3, 0x7a, 0x5d, 0xa9, 0x14, 0xad, 0x3e, 0x53, 0x29, 0x9e, 0x81, 0x81, 0xcd, 0xa0, - 0x49, 0xd2, 0xae, 0x26, 0x17, 0x83, 0x26, 0xc1, 0x0c, 0x82, 0x9e, 0xa6, 0x8b, 0xd0, 0xf5, 0x63, - 0x87, 0x6e, 0x47, 0x79, 0x9d, 0x31, 0xce, 0x17, 0xa0, 0x2a, 0xc6, 0x26, 0x8e, 0xfd, 0xbb, 0x15, - 0x18, 0x12, 0x7e, 0x51, 0x7d, 0x67, 0xc3, 0x91, 0x56, 0x9c, 0x42, 0x4f, 0x2b, 0x4e, 0x04, 0x83, - 0x35, 0x96, 0xef, 0x56, 0x68, 0xe8, 0x97, 0x73, 0x71, 0xa4, 0xe3, 0x29, 0x74, 0x75, 0xb7, 0xf8, - 0x7f, 0x2c, 0x48, 0xa1, 0xd7, 0x2d, 0x18, 0xaf, 0x05, 0xbe, 0x4f, 0x6a, 0x5a, 0x77, 0x1c, 0xc8, - 0xe3, 0x80, 0x30, 0x9f, 0x6c, 0x54, 0xdf, 0x04, 0xa7, 0x00, 0x38, 0x4d, 0x1e, 0xbd, 0x00, 0xa3, - 0x7c, 0xcc, 0xae, 0x25, 0xee, 0x60, 0x74, 0x86, 0x3d, 0x13, 0x88, 0x93, 0xb8, 0x68, 0x9a, 0xdf, - 0x65, 0x89, 0x5c, 0x76, 0x83, 0xda, 0x54, 0x6d, 0x64, 0xb1, 0x33, 0x30, 0x50, 0x08, 0x28, 0x24, - 0x1b, 0x21, 0x89, 0x36, 0x85, 0xdf, 0x18, 0xd3, 0x5b, 0x87, 0xee, 0x2c, 0x8f, 0x05, 0xee, 0x6a, - 0x09, 0x67, 0xb4, 0x8e, 0xb6, 0x84, 0x19, 0xa1, 0x9c, 0x07, 0x3f, 0x17, 0xd3, 0xdc, 0xd3, 0x9a, - 0x30, 0x05, 0x25, 0x26, 0xba, 0x98, 0xbe, 0x5c, 0xe4, 0xb1, 0x93, 0x4c, 0xb0, 0x61, 0x5e, 0x8e, - 0x16, 0xe0, 0x58, 0x2a, 0x3f, 0x60, 0x24, 0xee, 0x4a, 0x54, 0x9c, 0x5c, 0x2a, 0xb3, 0x60, 0x84, - 0xbb, 0x6a, 0x98, 0x26, 0xa6, 0xe1, 0x7d, 0x4c, 0x4c, 0x1d, 0xe5, 0x9d, 0xcc, 0x6f, 0x31, 0x5e, - 0xcc, 0x65, 0x00, 0xfa, 0x72, 0x45, 0xfe, 0x44, 0xca, 0x15, 0x79, 0x94, 0x75, 0xe0, 0x5a, 0x3e, - 0x1d, 0x38, 0xb8, 0xdf, 0xf1, 0xbd, 0xf4, 0x23, 0xfe, 0x9f, 0x16, 0xc8, 0x79, 0x9d, 0x77, 0x6a, - 0x9b, 0x84, 0x2e, 0x19, 0xf4, 0x4e, 0x18, 0x53, 0xd6, 0x09, 0xae, 0x12, 0x59, 0x6c, 0xd5, 0x28, - 0xdd, 0x19, 0x27, 0xa0, 0x38, 0x85, 0x8d, 0x66, 0xa0, 0x42, 0xc7, 0x89, 0x57, 0xe5, 0x72, 0x5f, - 0x59, 0x40, 0x66, 0x57, 0x17, 0x45, 0x2d, 0x8d, 0x83, 0x02, 0x98, 0xf0, 0x9c, 0x28, 0x66, 0x3d, - 0xa8, 0x76, 0xfc, 0xda, 0x1d, 0x66, 0x91, 0x61, 0xc1, 0x58, 0x4b, 0xe9, 0x86, 0x70, 0x77, 0xdb, - 0xf6, 0xbf, 0x2b, 0xc1, 0x68, 0x82, 0x33, 0x1e, 0x50, 0x61, 0x78, 0x12, 0xca, 0x52, 0x86, 0xa7, - 0xd3, 0x65, 0x29, 0x41, 0xaf, 0x30, 0xa8, 0xd0, 0x5a, 0xd7, 0x52, 0x35, 0xad, 0xe0, 0x18, 0x02, - 0x17, 0x9b, 0x78, 0x8c, 0x29, 0xc7, 0x5e, 0x34, 0xef, 0xb9, 0xc4, 0x8f, 0x79, 0x37, 0xf3, 0x61, - 0xca, 0x6b, 0x4b, 0x55, 0xb3, 0x51, 0xcd, 0x94, 0x53, 0x00, 0x9c, 0x26, 0x8f, 0x3e, 0x6c, 0xc1, - 0xa8, 0x73, 0x33, 0xd2, 0x49, 0xd9, 0x85, 0xd3, 0xf1, 0x21, 0x85, 0x54, 0x22, 0xcf, 0x3b, 0x37, - 0xec, 0x27, 0x8a, 0x70, 0x92, 0x28, 0x7a, 0xc3, 0x02, 0x44, 0x76, 0x48, 0x4d, 0xba, 0x45, 0x8b, - 0xbe, 0x0c, 0xe6, 0x71, 0x82, 0x3f, 0xd7, 0xd5, 0x2e, 0xe7, 0xea, 0xdd, 0xe5, 0x38, 0xa3, 0x0f, - 0xe8, 0x12, 0xa0, 0xba, 0x1b, 0x39, 0xeb, 0x1e, 0x99, 0x0f, 0x9a, 0x32, 0x80, 0x58, 0xdc, 0xa7, - 0x9f, 0x16, 0xe3, 0x8c, 0x16, 0xba, 0x30, 0x70, 0x46, 0x2d, 0xb6, 0xca, 0xc2, 0x60, 0xa7, 0x73, - 0x35, 0xf4, 0x98, 0x94, 0x30, 0x57, 0x99, 0x28, 0xc7, 0x0a, 0xc3, 0xfe, 0x8b, 0xa2, 0xda, 0xca, - 0x3a, 0x06, 0xc0, 0x31, 0x7c, 0x91, 0xad, 0x3b, 0xf7, 0x45, 0xd6, 0x9e, 0x52, 0xdd, 0x61, 0xf1, - 0x89, 0x28, 0xda, 0xc2, 0x3d, 0x8a, 0xa2, 0xfd, 0x59, 0x2b, 0x91, 0x92, 0x6e, 0xf8, 0xec, 0x4b, - 0xf9, 0xc6, 0x1f, 0x4c, 0x73, 0x2f, 0xae, 0x94, 0x5c, 0x49, 0x39, 0xef, 0x3d, 0x09, 0xe5, 0x0d, - 0xcf, 0x61, 0x89, 0x54, 0xd8, 0x46, 0x35, 0x3c, 0xcc, 0xce, 0x8b, 0x72, 0xac, 0x30, 0x28, 0xd7, - 0x37, 0x1a, 0x3d, 0x10, 0xd7, 0xfe, 0x8f, 0x45, 0x18, 0x36, 0x24, 0x7e, 0xa6, 0xfa, 0x66, 0xdd, - 0x67, 0xea, 0x5b, 0xe1, 0x00, 0xea, 0xdb, 0xcf, 0x40, 0xa5, 0x26, 0xa5, 0x51, 0x3e, 0x29, 0xf6, - 0xd3, 0x32, 0x4e, 0x0b, 0x24, 0x55, 0x84, 0x35, 0x4d, 0x74, 0x21, 0x11, 0xa9, 0x99, 0xb0, 0x0b, - 0x64, 0x85, 0x52, 0x0a, 0x89, 0xd6, 0x5d, 0x27, 0xed, 0x1f, 0x50, 0xda, 0xdf, 0x3f, 0xc0, 0xfe, - 0x86, 0xa5, 0x26, 0xf7, 0x2e, 0xa4, 0xe4, 0xb9, 0x91, 0x4c, 0xc9, 0x73, 0x2e, 0x97, 0x61, 0xee, - 0x91, 0x8b, 0xe7, 0x0a, 0x0c, 0xcd, 0x07, 0xcd, 0xa6, 0xe3, 0xd7, 0xd1, 0xf7, 0xc3, 0x50, 0x8d, - 0xff, 0x14, 0x36, 0x34, 0x76, 0x59, 0x2d, 0xa0, 0x58, 0xc2, 0xd0, 0xc3, 0x30, 0xe0, 0x84, 0x0d, - 0x69, 0x37, 0x63, 0x4e, 0x70, 0xb3, 0x61, 0x23, 0xc2, 0xac, 0xd4, 0xfe, 0x2b, 0x0b, 0xc6, 0x68, - 0x15, 0x97, 0x7d, 0x14, 0xfb, 0x9c, 0xc7, 0x61, 0xd0, 0x69, 0xc7, 0x9b, 0x41, 0xd7, 0x39, 0x6c, - 0x96, 0x95, 0x62, 0x01, 0xa5, 0xe7, 0x30, 0x95, 0xcb, 0xc1, 0x38, 0x87, 0x2d, 0xd0, 0xb5, 0xcc, - 0x20, 0x54, 0x95, 0x8d, 0xda, 0xeb, 0x59, 0xb7, 0xa5, 0x55, 0x5e, 0x8c, 0x25, 0x9c, 0x36, 0xb6, - 0x1e, 0xd4, 0x3b, 0xc2, 0xb5, 0x57, 0x35, 0x36, 0x17, 0xd4, 0x3b, 0x98, 0x41, 0xd0, 0x23, 0x50, - 0x8c, 0x36, 0x1d, 0x79, 0x2f, 0x2f, 0xbd, 0xcc, 0xab, 0x17, 0x67, 0x31, 0x2d, 0x57, 0x41, 0x13, - 0xa1, 0x97, 0xf6, 0xb1, 0x4d, 0x06, 0x4d, 0x84, 0x9e, 0xfd, 0x2f, 0x06, 0x80, 0xf9, 0xdb, 0x38, - 0x21, 0xa9, 0xaf, 0x05, 0x2c, 0x1b, 0xf0, 0x91, 0x5e, 0x6b, 0xeb, 0x83, 0xec, 0xfd, 0x7c, 0xb5, - 0x6d, 0x5c, 0x6f, 0x16, 0xef, 0xf6, 0xf5, 0x66, 0xf6, 0x8d, 0xf5, 0xc0, 0x7d, 0x74, 0x63, 0x6d, - 0x7f, 0xdc, 0x02, 0xa4, 0xbc, 0xa7, 0xb4, 0x4b, 0xc9, 0x0c, 0x54, 0x94, 0xbb, 0x96, 0xd8, 0x2f, - 0x9a, 0x2d, 0x4a, 0x00, 0xd6, 0x38, 0x7d, 0x58, 0x2f, 0x1e, 0x93, 0x32, 0xab, 0x98, 0x8c, 0xb9, - 0x60, 0x92, 0x4e, 0x88, 0x30, 0xfb, 0xf7, 0x0a, 0xf0, 0x00, 0x57, 0x97, 0x96, 0x1d, 0xdf, 0x69, - 0x90, 0x26, 0xed, 0x55, 0xbf, 0x4e, 0x42, 0x35, 0x7a, 0x6c, 0x76, 0x65, 0x84, 0xc4, 0x61, 0xf9, - 0x15, 0xe7, 0x33, 0x9c, 0xb3, 0x2c, 0xfa, 0x6e, 0x8c, 0x59, 0xe3, 0x28, 0x82, 0xb2, 0x7c, 0x8f, - 0x48, 0xc8, 0x9f, 0x9c, 0x08, 0x29, 0x56, 0x2c, 0x34, 0x0b, 0x82, 0x15, 0x21, 0xaa, 0x3e, 0x78, - 0x41, 0x6d, 0x8b, 0x6e, 0xf9, 0xb4, 0xfa, 0xb0, 0x24, 0xca, 0xb1, 0xc2, 0xb0, 0x9b, 0x30, 0x2e, - 0xc7, 0xb0, 0x75, 0x99, 0x74, 0x30, 0xd9, 0xa0, 0x32, 0xb7, 0x26, 0x8b, 0x8c, 0x27, 0x92, 0x94, - 0xcc, 0x9d, 0x37, 0x81, 0x38, 0x89, 0x2b, 0x13, 0x04, 0x17, 0xb2, 0x13, 0x04, 0xdb, 0xbf, 0x67, - 0x41, 0x5a, 0xe8, 0x1b, 0xe9, 0x50, 0xad, 0x3d, 0xd3, 0xa1, 0x1e, 0x20, 0xa1, 0xe8, 0x4f, 0xc2, - 0xb0, 0x13, 0x53, 0xad, 0x8e, 0x5b, 0x60, 0x8a, 0x77, 0x76, 0x73, 0xb8, 0x1c, 0xd4, 0xdd, 0x0d, - 0x97, 0x59, 0x5e, 0xcc, 0xe6, 0xec, 0x37, 0x2c, 0xa8, 0x2c, 0x84, 0x9d, 0x83, 0x87, 0xaa, 0x75, - 0x07, 0xa2, 0x15, 0x0e, 0x14, 0x88, 0x26, 0x43, 0xdd, 0x8a, 0xbd, 0x42, 0xdd, 0xec, 0xbf, 0x1e, - 0x80, 0x89, 0xae, 0xd8, 0x4b, 0xf4, 0x3c, 0x8c, 0xa8, 0x59, 0x92, 0x66, 0xd7, 0x8a, 0xe9, 0xbc, - 0xac, 0x61, 0x38, 0x81, 0xd9, 0xc7, 0x56, 0x5d, 0x84, 0xe3, 0x21, 0x79, 0xb5, 0x4d, 0xda, 0x64, - 0x76, 0x23, 0x26, 0x61, 0x95, 0xd4, 0x02, 0xbf, 0xce, 0xf3, 0x09, 0x17, 0xe7, 0x1e, 0xbc, 0xb5, - 0x3b, 0x75, 0x1c, 0x77, 0x83, 0x71, 0x56, 0x1d, 0xd4, 0x82, 0x51, 0xcf, 0x3c, 0x2f, 0x88, 0x63, - 0xea, 0x1d, 0x1d, 0x35, 0xd4, 0x6a, 0x4d, 0x14, 0xe3, 0x24, 0x81, 0xe4, 0xa1, 0xa3, 0x74, 0x8f, - 0x0e, 0x1d, 0x1f, 0xd2, 0x87, 0x0e, 0xee, 0x0b, 0xf4, 0xee, 0x9c, 0x63, 0x6f, 0xfb, 0x39, 0x75, - 0x1c, 0xe6, 0x1c, 0xf1, 0x22, 0x94, 0xa5, 0x9f, 0x64, 0x5f, 0xfe, 0x85, 0x66, 0x3b, 0x3d, 0x78, - 0xfb, 0xe3, 0xf0, 0xd6, 0x73, 0x61, 0x68, 0x0c, 0xe6, 0x95, 0x20, 0x9e, 0xf5, 0xbc, 0xe0, 0x26, - 0x55, 0x57, 0xae, 0x46, 0x44, 0xd8, 0x01, 0xed, 0xdb, 0x05, 0xc8, 0x38, 0x52, 0xd3, 0x3d, 0xa9, - 0xf5, 0xc2, 0xc4, 0x9e, 0x3c, 0x98, 0x6e, 0x88, 0x76, 0xb8, 0x2f, 0x29, 0xd7, 0x06, 0xde, 0x95, - 0xb7, 0x49, 0x40, 0xbb, 0x97, 0x2a, 0x4e, 0xa9, 0x5c, 0x4c, 0xcf, 0x02, 0x68, 0x75, 0x5e, 0xe8, - 0x84, 0xca, 0x39, 0x44, 0x6b, 0xfd, 0xd8, 0xc0, 0x42, 0xcf, 0xc1, 0xb0, 0xeb, 0x47, 0xb1, 0xe3, - 0x79, 0x17, 0x5d, 0x3f, 0x16, 0x7a, 0xa2, 0x52, 0x7b, 0x16, 0x35, 0x08, 0x9b, 0x78, 0xa7, 0xdf, - 0x61, 0xcc, 0xdf, 0x41, 0xe6, 0x7d, 0x13, 0x4e, 0x5d, 0x70, 0x63, 0x15, 0xa4, 0xa8, 0xd6, 0x1b, - 0xd5, 0xd6, 0x15, 0xaf, 0xb2, 0x7a, 0x86, 0xe5, 0x1a, 0x41, 0x82, 0x85, 0x64, 0x4c, 0x63, 0x3a, - 0x48, 0xd0, 0xae, 0xc1, 0x89, 0x0b, 0x6e, 0x7c, 0xde, 0xf5, 0xc8, 0x11, 0x12, 0xf9, 0xf2, 0x20, - 0x8c, 0x98, 0xb1, 0xfb, 0x07, 0xe1, 0xec, 0x9f, 0xa4, 0x7a, 0xac, 0x18, 0x08, 0x57, 0x5d, 0x78, - 0x5f, 0x3f, 0x74, 0x22, 0x81, 0xec, 0xc1, 0x35, 0x54, 0x59, 0x4d, 0x13, 0x9b, 0x1d, 0x40, 0x37, - 0xa1, 0xb4, 0xc1, 0xe2, 0xdd, 0x8a, 0x79, 0xb8, 0x2a, 0x65, 0x0d, 0xbe, 0xde, 0xb9, 0x3c, 0x62, - 0x8e, 0xd3, 0xa3, 0xea, 0x47, 0x98, 0x0c, 0xb3, 0x36, 0xa2, 0x10, 0x84, 0x5c, 0x53, 0x18, 0xbd, - 0xa4, 0x47, 0xe9, 0x0e, 0xa4, 0x47, 0x82, 0x97, 0x0f, 0xde, 0x23, 0x5e, 0xce, 0x62, 0x17, 0xe3, - 0x4d, 0xa6, 0x1c, 0x8b, 0xb0, 0xa9, 0x21, 0x36, 0x08, 0x46, 0xec, 0x62, 0x02, 0x8c, 0xd3, 0xf8, - 0xe8, 0xfd, 0x4a, 0x1a, 0x94, 0xf3, 0xb8, 0x50, 0x30, 0x57, 0xf4, 0x51, 0x0b, 0x82, 0x8f, 0x17, - 0x60, 0xec, 0x82, 0xdf, 0x5e, 0xbd, 0xb0, 0xda, 0x5e, 0xf7, 0xdc, 0xda, 0x65, 0xd2, 0xa1, 0xdc, - 0x7e, 0x8b, 0x74, 0x16, 0x17, 0xc4, 0x0e, 0x52, 0x6b, 0xe6, 0x32, 0x2d, 0xc4, 0x1c, 0x46, 0xf9, - 0xd6, 0x86, 0xeb, 0x37, 0x48, 0xd8, 0x0a, 0x5d, 0x61, 0xeb, 0x37, 0xf8, 0xd6, 0x79, 0x0d, 0xc2, - 0x26, 0x1e, 0x6d, 0x3b, 0xb8, 0xe9, 0x93, 0x30, 0x7d, 0x4a, 0x58, 0xa1, 0x85, 0x98, 0xc3, 0x28, - 0x52, 0x1c, 0xb6, 0x85, 0x29, 0xcd, 0x40, 0x5a, 0xa3, 0x85, 0x98, 0xc3, 0xc4, 0x29, 0x9d, 0x79, - 0x82, 0x95, 0xba, 0x4e, 0xe9, 0xcc, 0x89, 0x42, 0xc2, 0x29, 0xea, 0x16, 0xe9, 0x2c, 0x38, 0xb1, - 0x93, 0x3e, 0x64, 0x5f, 0xe6, 0xc5, 0x58, 0xc2, 0x59, 0x72, 0xe4, 0xe4, 0x70, 0x7c, 0xd7, 0x25, - 0x47, 0x4e, 0x76, 0xbf, 0x87, 0x41, 0xe6, 0x6f, 0x17, 0x60, 0xe4, 0xcd, 0x17, 0x4c, 0x33, 0xde, - 0xe6, 0xb9, 0x0e, 0x13, 0x5d, 0x11, 0xd3, 0x7d, 0x68, 0x48, 0xfb, 0x66, 0xb4, 0xb0, 0x31, 0x0c, - 0xd3, 0x86, 0x65, 0x52, 0xc0, 0x79, 0x98, 0xe0, 0x9b, 0x97, 0x52, 0x62, 0x01, 0xb0, 0x2a, 0x0a, - 0x9e, 0x5d, 0x66, 0x5d, 0x4b, 0x03, 0x71, 0x37, 0xbe, 0xfd, 0x09, 0x0b, 0x46, 0x13, 0x41, 0xec, - 0x39, 0xe9, 0x72, 0x6c, 0x77, 0x07, 0xcc, 0x8b, 0x99, 0x45, 0x95, 0x14, 0x99, 0x18, 0xd6, 0xbb, - 0x5b, 0x83, 0xb0, 0x89, 0x67, 0xff, 0x41, 0x11, 0xca, 0xd2, 0xe3, 0xaa, 0x8f, 0xae, 0x7c, 0xcc, - 0x82, 0x51, 0x75, 0x81, 0xc8, 0x2c, 0xbe, 0x85, 0x3c, 0x62, 0xea, 0x68, 0x0f, 0x94, 0xfd, 0xc4, - 0xdf, 0x08, 0xf4, 0xc1, 0x02, 0x9b, 0xc4, 0x70, 0x92, 0x36, 0xba, 0x06, 0x10, 0x75, 0xa2, 0x98, - 0x34, 0x0d, 0xdb, 0xb3, 0x6d, 0xac, 0xb2, 0xe9, 0x5a, 0x10, 0x12, 0xba, 0xa6, 0xae, 0x04, 0x75, - 0x52, 0x55, 0x98, 0x5a, 0xc3, 0xd3, 0x65, 0xd8, 0x68, 0x09, 0xbd, 0xa6, 0xae, 0xbb, 0x07, 0xf2, - 0x90, 0xeb, 0x72, 0x7c, 0xfb, 0xb9, 0xef, 0x3e, 0xc4, 0xfd, 0xb2, 0xfd, 0xeb, 0x05, 0x38, 0x96, - 0x1e, 0x49, 0xf4, 0x6e, 0x18, 0x91, 0x83, 0x66, 0x98, 0x19, 0xa4, 0x9b, 0xdb, 0x08, 0x36, 0x60, - 0xb7, 0x77, 0xa7, 0xa6, 0xba, 0x9f, 0xc2, 0x9e, 0x36, 0x51, 0x70, 0xa2, 0x31, 0x7e, 0xf9, 0x2c, - 0xbc, 0x24, 0xe6, 0x3a, 0xb3, 0xad, 0x96, 0xb8, 0x41, 0x36, 0x2e, 0x9f, 0x4d, 0x28, 0x4e, 0x61, - 0xa3, 0x55, 0x38, 0x61, 0x94, 0x5c, 0x21, 0x6e, 0x63, 0x73, 0x3d, 0x08, 0xe5, 0xb9, 0xf6, 0x61, - 0xed, 0x54, 0xdb, 0x8d, 0x83, 0x33, 0x6b, 0x52, 0xc5, 0xa8, 0xe6, 0xb4, 0x9c, 0x9a, 0x1b, 0x77, - 0xc4, 0x1d, 0x80, 0x62, 0xe3, 0xf3, 0xa2, 0x1c, 0x2b, 0x0c, 0xfb, 0x1f, 0x0c, 0xc0, 0x31, 0xee, - 0x45, 0x4a, 0x94, 0x93, 0x34, 0x7a, 0x37, 0x54, 0xa2, 0xd8, 0x09, 0xb9, 0x51, 0xc3, 0x3a, 0x30, - 0xeb, 0xd2, 0x91, 0xf7, 0xb2, 0x11, 0xac, 0xdb, 0x43, 0x2f, 0xb1, 0xb4, 0x65, 0x6e, 0xb4, 0xc9, - 0x5a, 0x2f, 0xdc, 0x99, 0xc9, 0xe4, 0xbc, 0x6a, 0x01, 0x1b, 0xad, 0xa1, 0x1f, 0x81, 0x52, 0x6b, - 0xd3, 0x89, 0xa4, 0x3d, 0xef, 0x71, 0xc9, 0x27, 0x56, 0x69, 0xe1, 0xed, 0xdd, 0xa9, 0x93, 0xe9, - 0x4f, 0x65, 0x00, 0xcc, 0x2b, 0x99, 0x5c, 0x7e, 0x60, 0xff, 0xa7, 0x75, 0xea, 0x61, 0xa7, 0x7a, - 0x71, 0x36, 0xfd, 0x18, 0xcb, 0x02, 0x2b, 0xc5, 0x02, 0x4a, 0x79, 0xd2, 0x26, 0x27, 0x59, 0xa7, - 0xc8, 0x83, 0x49, 0x8d, 0xe3, 0xa2, 0x06, 0x61, 0x13, 0x0f, 0x7d, 0xbc, 0xdb, 0xc7, 0x78, 0xe8, - 0x08, 0x62, 0x50, 0xfa, 0xf5, 0x2e, 0x3e, 0x07, 0x15, 0xd1, 0xd5, 0xb5, 0x00, 0x3d, 0x0f, 0x23, - 0xdc, 0x5c, 0x34, 0x17, 0x3a, 0x7e, 0x6d, 0x33, 0x6d, 0xe4, 0x59, 0x33, 0x60, 0x38, 0x81, 0x69, - 0x2f, 0xc3, 0x40, 0x9f, 0x4c, 0xb6, 0xaf, 0xb3, 0xfb, 0x8b, 0x50, 0xa6, 0xcd, 0xc9, 0x03, 0x5a, - 0x1e, 0x4d, 0x06, 0x50, 0x96, 0x0f, 0x35, 0x22, 0x1b, 0x8a, 0xae, 0x23, 0x7d, 0x49, 0xd4, 0x16, - 0x5a, 0x8c, 0xa2, 0x36, 0x5b, 0x76, 0x14, 0x88, 0x1e, 0x83, 0x22, 0xd9, 0x69, 0xa5, 0x9d, 0x46, - 0xce, 0xed, 0xb4, 0xdc, 0x90, 0x44, 0x14, 0x89, 0xec, 0xb4, 0xd0, 0x69, 0x28, 0xb8, 0x75, 0xb1, - 0x22, 0x41, 0xe0, 0x14, 0x16, 0x17, 0x70, 0xc1, 0xad, 0xdb, 0x3b, 0x50, 0x51, 0x2f, 0x43, 0xa2, - 0x2d, 0xa9, 0x52, 0x59, 0x79, 0x78, 0x11, 0xcb, 0x76, 0x7b, 0x28, 0x53, 0x6d, 0x00, 0x9d, 0xd2, - 0x21, 0x2f, 0x11, 0x7c, 0x06, 0x06, 0x6a, 0x81, 0x48, 0xc6, 0x53, 0xd6, 0xcd, 0x30, 0x5d, 0x8a, - 0x41, 0xec, 0xeb, 0x30, 0x76, 0xd9, 0x0f, 0x6e, 0xb2, 0x07, 0x9c, 0x58, 0xbe, 0x62, 0xda, 0xf0, - 0x06, 0xfd, 0x91, 0xd6, 0xdc, 0x19, 0x14, 0x73, 0x98, 0xca, 0xa4, 0x5a, 0xe8, 0x95, 0x49, 0xd5, - 0xfe, 0x80, 0x05, 0x23, 0x2a, 0x36, 0xfc, 0xc2, 0xf6, 0x16, 0x6d, 0xb7, 0x11, 0x06, 0xed, 0x56, - 0xba, 0x5d, 0xf6, 0x08, 0x2d, 0xe6, 0x30, 0x33, 0x69, 0x42, 0x61, 0x9f, 0xa4, 0x09, 0x67, 0x60, - 0x60, 0xcb, 0xf5, 0xeb, 0x69, 0xa3, 0xe8, 0x65, 0xd7, 0xaf, 0x63, 0x06, 0xa1, 0x5d, 0x38, 0xa6, - 0xba, 0x20, 0x75, 0xa6, 0xe7, 0x61, 0x64, 0xbd, 0xed, 0x7a, 0x75, 0x99, 0x88, 0x39, 0xb5, 0x5d, - 0xe6, 0x0c, 0x18, 0x4e, 0x60, 0xa2, 0xb3, 0x00, 0xeb, 0xae, 0xef, 0x84, 0x9d, 0x55, 0xad, 0xa4, - 0x29, 0xb9, 0x3d, 0xa7, 0x20, 0xd8, 0xc0, 0xb2, 0x3f, 0x55, 0x84, 0xb1, 0x64, 0x84, 0x7c, 0x1f, - 0xb6, 0x8b, 0xc7, 0xa0, 0xc4, 0x82, 0xe6, 0xd3, 0x53, 0xcb, 0x73, 0x17, 0x73, 0x18, 0x8a, 0x60, - 0x90, 0x6f, 0xe6, 0x7c, 0x1e, 0xf2, 0x54, 0x9d, 0x54, 0x96, 0x54, 0xe6, 0x6b, 0x2d, 0x0c, 0xd3, - 0x82, 0x14, 0xfa, 0xb0, 0x05, 0x43, 0x41, 0xcb, 0xcc, 0xc0, 0xf9, 0xae, 0x3c, 0xb3, 0x07, 0x88, - 0x10, 0x5d, 0xa1, 0x8f, 0xa8, 0xa9, 0x97, 0xd3, 0x21, 0x49, 0x9f, 0xfe, 0x61, 0x18, 0x31, 0x31, - 0xf7, 0x53, 0x49, 0xca, 0xa6, 0x4a, 0xf2, 0x31, 0x73, 0x51, 0x88, 0xfc, 0x08, 0x7d, 0x6c, 0xb7, - 0xab, 0x50, 0xaa, 0x29, 0x87, 0xb4, 0x3b, 0x4a, 0xdf, 0xaf, 0xf2, 0x87, 0xb1, 0xcb, 0x7e, 0xde, - 0x9a, 0xfd, 0x0d, 0xcb, 0x58, 0x1f, 0x98, 0x44, 0x8b, 0x75, 0x14, 0x42, 0xb1, 0xb1, 0xbd, 0x25, - 0xc4, 0xfc, 0xa5, 0x9c, 0x86, 0xf7, 0xc2, 0xf6, 0x96, 0x5e, 0xe3, 0x66, 0x29, 0xa6, 0xc4, 0xfa, - 0x30, 0xf7, 0x27, 0xd2, 0x68, 0x14, 0xf7, 0x4f, 0xa3, 0x61, 0xbf, 0x51, 0x80, 0x89, 0xae, 0x45, - 0x85, 0x5e, 0x83, 0x52, 0x48, 0xbf, 0x52, 0x7c, 0xde, 0x52, 0x6e, 0x89, 0x2f, 0xa2, 0xc5, 0xba, - 0x16, 0x9f, 0xc9, 0x72, 0xcc, 0x49, 0xa2, 0x4b, 0x80, 0xb4, 0xdb, 0xa4, 0xba, 0x6b, 0xe0, 0x9f, - 0xac, 0x7c, 0xab, 0x66, 0xbb, 0x30, 0x70, 0x46, 0x2d, 0xf4, 0x42, 0xfa, 0xca, 0xa2, 0x98, 0xbc, - 0x2b, 0xdb, 0xeb, 0xf6, 0xc1, 0xfe, 0xed, 0x02, 0x8c, 0x26, 0x12, 0xa2, 0x22, 0x0f, 0xca, 0xc4, - 0x63, 0x17, 0x99, 0x52, 0xd8, 0x1c, 0xf6, 0x79, 0x13, 0x25, 0x20, 0xcf, 0x89, 0x76, 0xb1, 0xa2, - 0x70, 0x7f, 0xb8, 0x5c, 0x3d, 0x0f, 0x23, 0xb2, 0x43, 0xef, 0x72, 0x9a, 0x9e, 0x18, 0x40, 0xb5, - 0x46, 0xcf, 0x19, 0x30, 0x9c, 0xc0, 0xb4, 0x7f, 0xbf, 0x08, 0x93, 0xfc, 0xe6, 0xb7, 0xae, 0x56, - 0x9e, 0xf2, 0xe0, 0xf8, 0x45, 0x9d, 0xb6, 0xd8, 0xca, 0xe3, 0x0d, 0xef, 0x5e, 0x84, 0xfa, 0xf2, - 0x14, 0xfe, 0x7c, 0xca, 0x53, 0x98, 0x9f, 0x4c, 0x1b, 0x47, 0xd4, 0xa3, 0xef, 0x2e, 0xd7, 0xe1, - 0x7f, 0x52, 0x80, 0xf1, 0xd4, 0x53, 0x6d, 0xe8, 0x53, 0xc9, 0xd7, 0x3d, 0xac, 0x3c, 0x6e, 0xc5, - 0xf6, 0x7c, 0xbd, 0xeb, 0x60, 0x6f, 0x7c, 0xdc, 0xa3, 0xad, 0x62, 0x7f, 0xbd, 0x00, 0x63, 0xc9, - 0x37, 0xe6, 0xee, 0xc3, 0x91, 0x7a, 0x3b, 0x54, 0xd8, 0x33, 0x4a, 0x97, 0x49, 0x47, 0x5e, 0xaa, - 0xf1, 0x17, 0x6b, 0x64, 0x21, 0xd6, 0xf0, 0xfb, 0xe2, 0xe9, 0x14, 0xfb, 0x9f, 0x59, 0x70, 0x92, - 0x7f, 0x65, 0x7a, 0x1d, 0xfe, 0xad, 0xac, 0xd1, 0x7d, 0x39, 0xdf, 0x0e, 0xa6, 0xd2, 0x6d, 0xef, - 0x37, 0xbe, 0xec, 0x25, 0x73, 0xd1, 0xdb, 0xe4, 0x52, 0xb8, 0x0f, 0x3b, 0x7b, 0xa0, 0xc5, 0x60, - 0xff, 0xfb, 0x02, 0x0c, 0xaf, 0xcc, 0x2f, 0x2a, 0x16, 0x3e, 0x03, 0x95, 0x5a, 0x48, 0x1c, 0x6d, - 0xed, 0x30, 0xfd, 0x8a, 0x24, 0x00, 0x6b, 0x1c, 0x7a, 0x68, 0xe0, 0x7e, 0x79, 0x51, 0xfa, 0xd0, - 0xc0, 0xdd, 0xf6, 0x22, 0x2c, 0xe1, 0xe8, 0x49, 0x28, 0xb3, 0x88, 0xd9, 0xab, 0xa1, 0x94, 0x38, - 0xfa, 0x24, 0xc9, 0xca, 0xf1, 0x12, 0x56, 0x18, 0xb4, 0xe1, 0x7a, 0x50, 0x8b, 0x28, 0x72, 0xca, - 0x00, 0xb1, 0x40, 0x8b, 0xf1, 0x12, 0x96, 0x70, 0x96, 0xf0, 0x90, 0x1d, 0xd2, 0x29, 0x72, 0x29, - 0xd9, 0x69, 0x7e, 0x9a, 0xa7, 0xe8, 0x1a, 0xe7, 0x20, 0x89, 0x31, 0x53, 0x51, 0x6b, 0x43, 0xfd, - 0x45, 0xad, 0xd9, 0x5f, 0x2f, 0x82, 0x7e, 0x14, 0x1f, 0xb9, 0x22, 0x4d, 0x44, 0x2e, 0xe9, 0xdc, - 0xab, 0x1d, 0xbf, 0xa6, 0x9f, 0xdf, 0x2f, 0xa7, 0xb2, 0x44, 0xfc, 0xbc, 0x05, 0xc3, 0xae, 0xef, - 0xc6, 0xae, 0xc3, 0x4c, 0x61, 0xf9, 0xbc, 0x6c, 0xad, 0xc8, 0x2d, 0xf2, 0x96, 0x83, 0xd0, 0xbc, - 0xe1, 0x56, 0xc4, 0xb0, 0x49, 0x19, 0xbd, 0x57, 0x04, 0x49, 0x15, 0x73, 0xcb, 0xb5, 0x52, 0x4e, - 0x45, 0x46, 0xb5, 0xa8, 0x42, 0x1b, 0x87, 0x39, 0xa5, 0x28, 0xc2, 0xb4, 0x29, 0xf5, 0x32, 0x88, - 0x3a, 0x32, 0xb0, 0x62, 0xcc, 0x09, 0xd9, 0x11, 0xa0, 0xee, 0xb1, 0x38, 0x60, 0x00, 0xca, 0x0c, - 0x54, 0x9c, 0x76, 0x1c, 0x34, 0xe9, 0x30, 0x89, 0xfb, 0x71, 0x1d, 0x62, 0x23, 0x01, 0x58, 0xe3, - 0xd8, 0x9f, 0x2a, 0x41, 0x2a, 0x69, 0x03, 0xda, 0x81, 0x8a, 0x4a, 0xdb, 0x90, 0x4f, 0x40, 0xa7, - 0x5e, 0x51, 0xaa, 0x33, 0xaa, 0x08, 0x6b, 0x62, 0xa8, 0x21, 0xad, 0x8a, 0x7c, 0xb7, 0xbf, 0x98, - 0xb6, 0x2a, 0xfe, 0x78, 0x7f, 0x97, 0x4c, 0x74, 0xad, 0xce, 0xf0, 0x34, 0x7d, 0xd3, 0xfb, 0x1a, - 0x20, 0xf7, 0x7b, 0xdb, 0xfb, 0x83, 0xe2, 0x1d, 0x2e, 0x4c, 0xa2, 0xb6, 0x17, 0x8b, 0xd5, 0xf0, - 0x62, 0x8e, 0xbb, 0x8c, 0x37, 0xac, 0x93, 0x1f, 0xf1, 0xff, 0xd8, 0x20, 0x9a, 0x34, 0x13, 0x0f, - 0x1e, 0xa9, 0x99, 0x78, 0x28, 0x57, 0x33, 0xf1, 0x59, 0x00, 0xb6, 0xb6, 0xb9, 0xa3, 0x7c, 0x99, - 0x59, 0xef, 0x94, 0x88, 0xc1, 0x0a, 0x82, 0x0d, 0x2c, 0xfb, 0x07, 0x21, 0x99, 0xbd, 0x0b, 0x4d, - 0xc9, 0x64, 0x61, 0xfc, 0x02, 0x8c, 0xc5, 0x28, 0x26, 0xf2, 0x7a, 0xfd, 0xa6, 0x05, 0x66, 0x8a, - 0x31, 0xf4, 0x2a, 0xcf, 0x65, 0x66, 0xe5, 0x71, 0xa1, 0x62, 0xb4, 0x3b, 0xbd, 0xec, 0xb4, 0x52, - 0xce, 0x3d, 0x32, 0xa1, 0xd9, 0xe9, 0x77, 0x40, 0x59, 0x42, 0x0f, 0xa4, 0x2c, 0xbf, 0x1f, 0x8e, - 0xcb, 0x7c, 0x07, 0xf2, 0xee, 0x43, 0x5c, 0xb2, 0xef, 0x6f, 0x52, 0x93, 0x76, 0xb2, 0x42, 0x2f, - 0x3b, 0x99, 0x3a, 0xfd, 0x17, 0x7b, 0x66, 0x29, 0xff, 0x2d, 0x0b, 0xce, 0xa4, 0x3b, 0x10, 0x2d, - 0x07, 0xbe, 0x1b, 0x07, 0x61, 0x95, 0xc4, 0xb1, 0xeb, 0x37, 0x58, 0xca, 0xd9, 0x9b, 0x4e, 0x28, - 0x9f, 0x1d, 0x62, 0x8c, 0xf2, 0xba, 0x13, 0xfa, 0x98, 0x95, 0xa2, 0x0e, 0x0c, 0x72, 0xcf, 0x62, - 0x71, 0x0a, 0x3a, 0xe4, 0xde, 0xc8, 0x18, 0x0e, 0x7d, 0x0c, 0xe3, 0x5e, 0xcd, 0x58, 0x10, 0xb4, - 0xbf, 0x65, 0x01, 0x5a, 0xd9, 0x26, 0x61, 0xe8, 0xd6, 0x0d, 0x5f, 0x68, 0xf6, 0x9e, 0xa5, 0xf1, - 0x6e, 0xa5, 0x99, 0x8d, 0x23, 0xf5, 0x9e, 0xa5, 0xf1, 0x2f, 0xfb, 0x3d, 0xcb, 0xc2, 0xc1, 0xde, - 0xb3, 0x44, 0x2b, 0x70, 0xb2, 0xc9, 0x8f, 0x71, 0xfc, 0x8d, 0x38, 0x7e, 0xa6, 0x53, 0x81, 0xe3, - 0xa7, 0x6e, 0xed, 0x4e, 0x9d, 0x5c, 0xce, 0x42, 0xc0, 0xd9, 0xf5, 0xec, 0x77, 0x00, 0xe2, 0x2e, - 0xd0, 0xf3, 0x59, 0x5e, 0x9c, 0x3d, 0xcd, 0x5a, 0xf6, 0xe7, 0x4a, 0x30, 0x9e, 0x7a, 0x94, 0x82, - 0x1e, 0xa1, 0xbb, 0xdd, 0x46, 0x0f, 0x2d, 0xbf, 0xbb, 0xbb, 0xd7, 0x97, 0x23, 0xaa, 0x0f, 0x25, - 0xd7, 0x6f, 0xb5, 0xe3, 0x7c, 0xf2, 0x56, 0xf0, 0x4e, 0x2c, 0xd2, 0x06, 0x0d, 0x33, 0x3c, 0xfd, - 0x8b, 0x39, 0x99, 0x3c, 0xdd, 0x5a, 0x13, 0x87, 0x9c, 0x81, 0x7b, 0x64, 0x66, 0xf9, 0xa0, 0x76, - 0x32, 0x2d, 0xe5, 0x61, 0xb0, 0x4d, 0x2d, 0x96, 0xa3, 0xf6, 0x2c, 0xfa, 0x52, 0x01, 0x86, 0x8d, - 0x49, 0x43, 0xbf, 0x92, 0x4c, 0xc0, 0x69, 0xe5, 0xf7, 0x49, 0xac, 0xfd, 0x69, 0x9d, 0x62, 0x93, - 0x7f, 0xd2, 0xe3, 0xdd, 0xb9, 0x37, 0x6f, 0xef, 0x4e, 0x1d, 0x4b, 0x65, 0xd7, 0x4c, 0xe4, 0xe3, - 0x3c, 0xfd, 0xd3, 0x30, 0x9e, 0x6a, 0x26, 0xe3, 0x93, 0xd7, 0xcc, 0x4f, 0x3e, 0xb4, 0xb9, 0xcf, - 0x1c, 0xb2, 0x2f, 0xd2, 0x21, 0x13, 0xe1, 0xf2, 0x81, 0x47, 0xfa, 0xb0, 0x6d, 0xa7, 0xce, 0x17, - 0x85, 0x3e, 0xb3, 0x62, 0x3c, 0x01, 0xe5, 0x56, 0xe0, 0xb9, 0x35, 0x57, 0xe5, 0xef, 0x66, 0x79, - 0x38, 0x56, 0x45, 0x19, 0x56, 0x50, 0x74, 0x13, 0x2a, 0x37, 0x6e, 0xc6, 0xfc, 0x56, 0x4d, 0xdc, - 0x1b, 0xe4, 0x75, 0x99, 0xa6, 0x94, 0x16, 0x75, 0x6d, 0x87, 0x35, 0x2d, 0x64, 0xc3, 0x20, 0x13, - 0x82, 0x32, 0x74, 0x8e, 0xdd, 0x69, 0x30, 0xe9, 0x18, 0x61, 0x01, 0xb1, 0xbf, 0x03, 0x70, 0x22, - 0xeb, 0x65, 0x20, 0xf4, 0x3e, 0x18, 0xe4, 0x7d, 0xcc, 0xe7, 0xf1, 0xb9, 0x2c, 0x1a, 0x17, 0x58, - 0x83, 0xa2, 0x5b, 0xec, 0x37, 0x16, 0x34, 0x05, 0x75, 0xcf, 0x59, 0x17, 0x2b, 0xe4, 0x68, 0xa8, - 0x2f, 0x39, 0x9a, 0xfa, 0x92, 0xc3, 0xa9, 0x7b, 0xce, 0x3a, 0xda, 0x81, 0x52, 0xc3, 0x8d, 0x89, - 0x23, 0x8c, 0x33, 0xd7, 0x8f, 0x84, 0x38, 0x71, 0xb8, 0x96, 0xc6, 0x7e, 0x62, 0x4e, 0x10, 0x7d, - 0xc1, 0x82, 0xf1, 0xf5, 0x64, 0x3a, 0x1e, 0xc1, 0x3c, 0x9d, 0x23, 0x78, 0xfd, 0x29, 0x49, 0x88, - 0x3f, 0xe8, 0x9a, 0x2a, 0xc4, 0xe9, 0xee, 0xa0, 0x0f, 0x59, 0x30, 0xb4, 0xe1, 0x7a, 0xc6, 0xf3, - 0x1a, 0x47, 0x30, 0x39, 0xe7, 0x19, 0x01, 0x7d, 0xe2, 0xe0, 0xff, 0x23, 0x2c, 0x29, 0xf7, 0x92, - 0x54, 0x83, 0x87, 0x95, 0x54, 0x43, 0xf7, 0x48, 0x52, 0x7d, 0xd4, 0x82, 0x8a, 0x1a, 0x69, 0x91, - 0xd6, 0xe4, 0xdd, 0x47, 0x38, 0xe5, 0xdc, 0x22, 0xa5, 0xfe, 0x62, 0x4d, 0x1c, 0xbd, 0x6e, 0xc1, - 0xb0, 0xf3, 0x5a, 0x3b, 0x24, 0x75, 0xb2, 0x1d, 0xb4, 0x22, 0x91, 0x6f, 0xf4, 0xe5, 0xfc, 0x3b, - 0x33, 0x4b, 0x89, 0x2c, 0x90, 0xed, 0x95, 0x56, 0x24, 0xc2, 0x7a, 0x75, 0x01, 0x36, 0xbb, 0x80, - 0x7e, 0x4e, 0xcb, 0x71, 0xc8, 0x23, 0xeb, 0x74, 0x56, 0x6f, 0x8e, 0x5a, 0x98, 0xef, 0x16, 0x60, - 0x6a, 0x9f, 0x51, 0x40, 0xcf, 0xc3, 0x48, 0x10, 0x36, 0x1c, 0xdf, 0x7d, 0xcd, 0xcc, 0x11, 0xa6, - 0x34, 0xc5, 0x15, 0x03, 0x86, 0x13, 0x98, 0x66, 0xf2, 0x98, 0xc2, 0x3e, 0xc9, 0x63, 0xce, 0xc0, - 0x40, 0x48, 0x5a, 0x41, 0xfa, 0xc0, 0xc3, 0x42, 0xe4, 0x18, 0x04, 0x3d, 0x02, 0x45, 0xa7, 0xe5, - 0x0a, 0xab, 0x9f, 0x3a, 0xc7, 0xcd, 0xae, 0x2e, 0x62, 0x5a, 0x9e, 0xc8, 0x65, 0x55, 0xba, 0x2b, - 0xb9, 0xac, 0xa8, 0x28, 0x13, 0xf7, 0x5a, 0x83, 0x5a, 0x94, 0x25, 0xef, 0x9b, 0xec, 0x37, 0x8a, - 0xf0, 0xc8, 0x9e, 0x6b, 0x5e, 0xbb, 0x4e, 0x5b, 0x7b, 0xb8, 0x4e, 0xcb, 0xe1, 0x29, 0xec, 0x37, - 0x3c, 0xc5, 0x1e, 0xc3, 0xf3, 0x21, 0xba, 0x95, 0x65, 0x6e, 0xb5, 0x7c, 0xde, 0x24, 0xef, 0x95, - 0xaa, 0x4d, 0xec, 0x62, 0x09, 0xc5, 0x9a, 0x2e, 0x3d, 0xc7, 0x24, 0x12, 0xa7, 0x94, 0xf2, 0x10, - 0x65, 0x3d, 0xf3, 0x9b, 0xf1, 0xfd, 0xdb, 0x2b, 0x1b, 0x8b, 0xfd, 0x3b, 0x03, 0xf0, 0x58, 0x1f, - 0x12, 0xc8, 0x5c, 0xc5, 0x56, 0x9f, 0xab, 0xf8, 0xbb, 0x7c, 0x9a, 0x3e, 0x92, 0x39, 0x4d, 0x38, - 0xff, 0x69, 0xda, 0x7b, 0x86, 0xd8, 0xd5, 0x80, 0x1f, 0x91, 0x5a, 0x3b, 0xe4, 0x61, 0x24, 0x46, - 0xfc, 0xec, 0xa2, 0x28, 0xc7, 0x0a, 0x83, 0x9e, 0x4b, 0x6b, 0x0e, 0xdd, 0xfe, 0x43, 0x39, 0x25, - 0xca, 0x30, 0x43, 0x71, 0xb9, 0x5a, 0x34, 0x3f, 0x4b, 0x39, 0x00, 0x27, 0x63, 0xff, 0xb2, 0x05, - 0xa7, 0x7b, 0xab, 0x09, 0xe8, 0x69, 0x18, 0x5e, 0x67, 0x4e, 0x7d, 0xcb, 0xcc, 0x71, 0x48, 0x2c, - 0x1d, 0xf6, 0xbd, 0xba, 0x18, 0x9b, 0x38, 0x68, 0x1e, 0x26, 0x4c, 0x6f, 0xc0, 0x65, 0xc3, 0xe3, - 0x88, 0x19, 0x32, 0xd6, 0xd2, 0x40, 0xdc, 0x8d, 0x6f, 0x7f, 0xbb, 0x98, 0xdd, 0x2d, 0xae, 0x4e, - 0x1e, 0x64, 0x35, 0x8b, 0xb5, 0x5a, 0xe8, 0x83, 0xe3, 0x16, 0xef, 0x36, 0xc7, 0x1d, 0xe8, 0xc5, - 0x71, 0xd1, 0x02, 0x1c, 0x33, 0x9e, 0x0b, 0xe5, 0xa9, 0x53, 0xf8, 0xed, 0x8f, 0xca, 0x7b, 0xb6, - 0x9a, 0x82, 0xe3, 0xae, 0x1a, 0xf7, 0xf9, 0xd2, 0xfb, 0x4a, 0x01, 0x4e, 0xf5, 0xd4, 0xe0, 0xef, - 0x92, 0x44, 0x31, 0xa7, 0x7f, 0xe0, 0xee, 0x4c, 0xbf, 0x39, 0x29, 0xa5, 0x7d, 0x27, 0xa5, 0x1f, - 0xf1, 0xfc, 0x27, 0x85, 0x9e, 0x9b, 0x85, 0x9e, 0xf8, 0xbe, 0x67, 0x47, 0xf2, 0x05, 0x18, 0x75, - 0x5a, 0x2d, 0x8e, 0xc7, 0x3c, 0xfe, 0x53, 0xb9, 0x18, 0x67, 0x4d, 0x20, 0x4e, 0xe2, 0xf6, 0x35, - 0xb0, 0x7f, 0x6e, 0x41, 0x05, 0x93, 0x0d, 0xce, 0xb1, 0xd0, 0x0d, 0x31, 0x44, 0x56, 0x1e, 0x09, - 0xf1, 0xe9, 0xc0, 0x46, 0x2e, 0xcb, 0x12, 0x9f, 0x35, 0xd8, 0x87, 0x8d, 0xec, 0x57, 0x8f, 0x8c, - 0x16, 0x7b, 0x3f, 0x32, 0x6a, 0x7f, 0xb9, 0x42, 0x3f, 0xaf, 0x15, 0xcc, 0x87, 0xa4, 0x1e, 0xd1, - 0xf9, 0x6d, 0x87, 0x9e, 0x58, 0x24, 0x6a, 0x7e, 0xaf, 0xe2, 0x25, 0x4c, 0xcb, 0x13, 0x17, 0x81, - 0x85, 0x03, 0x65, 0xa2, 0x2b, 0xee, 0x9b, 0x89, 0xee, 0x05, 0x18, 0x8d, 0xa2, 0xcd, 0xd5, 0xd0, - 0xdd, 0x76, 0x62, 0x72, 0x99, 0xc8, 0x94, 0x35, 0x3a, 0x2b, 0x53, 0xf5, 0xa2, 0x06, 0xe2, 0x24, - 0x2e, 0xba, 0x00, 0x13, 0x3a, 0x1f, 0x1c, 0x09, 0x63, 0x16, 0x4a, 0xc7, 0x57, 0x82, 0x4a, 0x47, - 0xa2, 0x33, 0xc8, 0x09, 0x04, 0xdc, 0x5d, 0x87, 0xf2, 0xdc, 0x44, 0x21, 0xed, 0xc8, 0x60, 0x92, - 0xe7, 0x26, 0xda, 0xa1, 0x7d, 0xe9, 0xaa, 0x81, 0x96, 0xe1, 0x38, 0x5f, 0x18, 0xb3, 0xad, 0x96, - 0xf1, 0x45, 0x43, 0xc9, 0x2c, 0xe4, 0x17, 0xba, 0x51, 0x70, 0x56, 0x3d, 0xf4, 0x1c, 0x0c, 0xab, - 0xe2, 0xc5, 0x05, 0x71, 0x87, 0xa5, 0x6c, 0x68, 0xaa, 0x99, 0xc5, 0x3a, 0x36, 0xf1, 0xd0, 0xbb, - 0xe0, 0x41, 0xfd, 0x97, 0x87, 0x66, 0xf3, 0x8b, 0xdd, 0x05, 0x91, 0x6a, 0x53, 0x3d, 0x72, 0x75, - 0x21, 0x13, 0xad, 0x8e, 0x7b, 0xd5, 0x47, 0xeb, 0x70, 0x5a, 0x81, 0xce, 0xf9, 0x31, 0x0b, 0x9e, - 0x8c, 0xc8, 0x9c, 0x13, 0x31, 0x17, 0x05, 0x60, 0xdf, 0x69, 0x8b, 0xd6, 0x4f, 0x5f, 0x70, 0xe3, - 0x8b, 0x59, 0x98, 0x78, 0x09, 0xef, 0xd1, 0x0a, 0x9a, 0x81, 0x0a, 0xf1, 0x9d, 0x75, 0x8f, 0xac, - 0xcc, 0x2f, 0xb2, 0x94, 0x9d, 0xc6, 0x3d, 0xf2, 0x39, 0x09, 0xc0, 0x1a, 0x47, 0xf9, 0x8d, 0x8f, - 0xf4, 0xf2, 0x1b, 0x47, 0xab, 0x70, 0xa2, 0x51, 0x6b, 0x51, 0xad, 0xd1, 0xad, 0x91, 0xd9, 0x1a, - 0x73, 0x93, 0xa5, 0x13, 0xc3, 0xd3, 0xc3, 0xab, 0x00, 0x9c, 0x0b, 0xf3, 0xab, 0x5d, 0x38, 0x38, - 0xb3, 0x26, 0x73, 0xa7, 0x0e, 0x83, 0x9d, 0xce, 0xe4, 0xf1, 0x94, 0x3b, 0x35, 0x2d, 0xc4, 0x1c, - 0x86, 0x2e, 0x01, 0x62, 0x41, 0x68, 0x17, 0xe3, 0xb8, 0xa5, 0xd4, 0xd4, 0xc9, 0x13, 0xc9, 0xc4, - 0x7b, 0xe7, 0xbb, 0x30, 0x70, 0x46, 0x2d, 0xaa, 0xf5, 0xf8, 0x01, 0x6b, 0x7d, 0xf2, 0xc1, 0xa4, - 0xd6, 0x73, 0x85, 0x17, 0x63, 0x09, 0x47, 0x3f, 0x09, 0x93, 0xed, 0x88, 0xb0, 0x03, 0xf0, 0xf5, - 0x20, 0xdc, 0xf2, 0x02, 0xa7, 0xbe, 0xc8, 0x5e, 0x33, 0x8d, 0x3b, 0x93, 0x93, 0x8c, 0xf8, 0x19, - 0x51, 0x77, 0xf2, 0x6a, 0x0f, 0x3c, 0xdc, 0xb3, 0x85, 0x74, 0xe6, 0xc8, 0x53, 0x7d, 0x66, 0x8e, - 0x5c, 0x85, 0x13, 0x52, 0xae, 0xad, 0xcc, 0x2f, 0xaa, 0x8f, 0x9e, 0x3c, 0x9d, 0x7c, 0x1e, 0x6d, - 0x31, 0x03, 0x07, 0x67, 0xd6, 0xb4, 0xff, 0xcc, 0x82, 0x51, 0xc5, 0xc1, 0xee, 0x42, 0x30, 0xac, - 0x97, 0x0c, 0x86, 0xbd, 0x70, 0x78, 0x19, 0xc0, 0x7a, 0xde, 0x23, 0x74, 0xe3, 0x33, 0xa3, 0x00, - 0x5a, 0x4e, 0x28, 0x11, 0x6d, 0xf5, 0x14, 0xd1, 0xf7, 0x2d, 0x8f, 0xce, 0xca, 0x04, 0x58, 0xba, - 0xb7, 0x99, 0x00, 0xab, 0x70, 0x52, 0x2e, 0x29, 0x7e, 0x77, 0x7b, 0x31, 0x88, 0x14, 0xcb, 0x37, - 0xde, 0xbb, 0x5b, 0xcc, 0x42, 0xc2, 0xd9, 0x75, 0x13, 0xba, 0xdd, 0xd0, 0xbe, 0xba, 0x9d, 0xe2, - 0x72, 0x4b, 0x1b, 0xf2, 0x35, 0xca, 0x14, 0x97, 0x5b, 0x3a, 0x5f, 0xc5, 0x1a, 0x27, 0x5b, 0xd4, - 0x55, 0x72, 0x12, 0x75, 0x70, 0x60, 0x51, 0x27, 0x99, 0xee, 0x70, 0x4f, 0xa6, 0x2b, 0xef, 0x88, - 0x46, 0x7a, 0xde, 0x11, 0xbd, 0x13, 0xc6, 0x5c, 0x7f, 0x93, 0x84, 0x6e, 0x4c, 0xea, 0x6c, 0x2f, - 0x30, 0x86, 0x5c, 0xd6, 0x8a, 0xce, 0x62, 0x02, 0x8a, 0x53, 0xd8, 0x49, 0x49, 0x31, 0xd6, 0x87, - 0xa4, 0xe8, 0x21, 0x9f, 0xc7, 0xf3, 0x91, 0xcf, 0xc7, 0x0e, 0x2f, 0x9f, 0x27, 0x8e, 0x54, 0x3e, - 0xa3, 0x5c, 0xe4, 0x73, 0x5f, 0xa2, 0xcf, 0x38, 0xa4, 0x9f, 0xd8, 0xe7, 0x90, 0xde, 0x4b, 0x38, - 0x9f, 0xbc, 0x63, 0xe1, 0x9c, 0x2d, 0x77, 0x1f, 0x78, 0x53, 0xee, 0xe6, 0x22, 0x77, 0x3f, 0x5a, - 0x80, 0x93, 0x5a, 0x32, 0x51, 0x7e, 0xe0, 0x6e, 0x50, 0xde, 0xcc, 0x9e, 0x78, 0xe6, 0x37, 0xcb, - 0x46, 0x08, 0xb6, 0x0e, 0x42, 0x57, 0x10, 0x6c, 0x60, 0xb1, 0x48, 0x66, 0x12, 0xb2, 0xc7, 0x45, - 0xd2, 0x62, 0x6b, 0x5e, 0x94, 0x63, 0x85, 0x41, 0x07, 0x81, 0xfe, 0x16, 0x89, 0x34, 0xd2, 0x69, - 0xab, 0xe7, 0x35, 0x08, 0x9b, 0x78, 0xe8, 0x09, 0x4e, 0x84, 0xb1, 0x4c, 0x2a, 0xba, 0x46, 0xf8, - 0xb1, 0x52, 0x71, 0x49, 0x05, 0x95, 0xdd, 0x61, 0x91, 0xf6, 0xa5, 0xee, 0xee, 0x30, 0x27, 0x4d, - 0x85, 0x61, 0xff, 0x0f, 0x0b, 0x4e, 0x65, 0x0e, 0xc5, 0x5d, 0x50, 0x47, 0x76, 0x92, 0xea, 0x48, - 0x35, 0xaf, 0x23, 0xa9, 0xf1, 0x15, 0x3d, 0x54, 0x93, 0xff, 0x60, 0xc1, 0x98, 0xc6, 0xbf, 0x0b, - 0x9f, 0xea, 0x26, 0x3f, 0x35, 0xbf, 0xd3, 0x77, 0xa5, 0xeb, 0xdb, 0x7e, 0xbf, 0x00, 0x2a, 0x95, - 0xfc, 0x6c, 0x4d, 0x3e, 0xd4, 0xb1, 0x8f, 0xaf, 0x43, 0x07, 0x06, 0x99, 0xab, 0x46, 0x94, 0x8f, - 0x1b, 0x5a, 0x92, 0x3e, 0x73, 0xfb, 0xd0, 0x37, 0x67, 0xec, 0x6f, 0x84, 0x05, 0x41, 0xf6, 0xf4, - 0x0d, 0xcf, 0xd2, 0x5d, 0x17, 0x01, 0xb9, 0xfa, 0xe9, 0x1b, 0x51, 0x8e, 0x15, 0x06, 0x15, 0x98, - 0x6e, 0x2d, 0xf0, 0xe7, 0x3d, 0x27, 0x8a, 0x84, 0x0e, 0xa7, 0x04, 0xe6, 0xa2, 0x04, 0x60, 0x8d, - 0xc3, 0xbc, 0x38, 0xdc, 0xa8, 0xe5, 0x39, 0x1d, 0xc3, 0xc6, 0x62, 0x24, 0x8c, 0x52, 0x20, 0x6c, - 0xe2, 0xd9, 0x4d, 0x98, 0x4c, 0x7e, 0xc4, 0x02, 0xd9, 0x60, 0x2e, 0xd4, 0x7d, 0x0d, 0xe7, 0x0c, - 0x54, 0x1c, 0x56, 0x6b, 0xa9, 0xed, 0x08, 0x9e, 0xa0, 0x1d, 0x89, 0x25, 0x00, 0x6b, 0x1c, 0xfb, - 0x9f, 0x5a, 0x70, 0x3c, 0x63, 0xd0, 0x72, 0x0c, 0x78, 0x8e, 0x35, 0xb7, 0xc9, 0x52, 0x75, 0x7e, - 0x00, 0x86, 0xea, 0x64, 0xc3, 0x91, 0x4e, 0xba, 0xa6, 0x4f, 0x3f, 0x2f, 0xc6, 0x12, 0x6e, 0xff, - 0x76, 0x01, 0xc6, 0x93, 0x7d, 0x8d, 0x58, 0x10, 0x21, 0x1f, 0x26, 0x37, 0xaa, 0x05, 0xdb, 0x24, - 0xec, 0xd0, 0x2f, 0xb7, 0x52, 0x41, 0x84, 0x5d, 0x18, 0x38, 0xa3, 0x16, 0x7b, 0x48, 0xa2, 0xae, - 0x46, 0x5b, 0xae, 0xc8, 0x6b, 0x79, 0xae, 0x48, 0x3d, 0x99, 0xa6, 0x43, 0x8f, 0x22, 0x89, 0x4d, - 0xfa, 0x54, 0xe5, 0x62, 0x51, 0x19, 0x73, 0x6d, 0xd7, 0x8b, 0x5d, 0x5f, 0x7c, 0xb2, 0x58, 0xab, - 0x4a, 0xe5, 0x5a, 0xee, 0x46, 0xc1, 0x59, 0xf5, 0xec, 0x6f, 0x0d, 0x80, 0x4a, 0xe6, 0xc1, 0x1c, - 0x2e, 0x73, 0x72, 0x57, 0x3d, 0x68, 0x28, 0xaa, 0x5a, 0x5b, 0x03, 0x7b, 0x79, 0x40, 0x71, 0xc3, - 0x9c, 0x69, 0xc1, 0x57, 0x03, 0xb6, 0xa6, 0x41, 0xd8, 0xc4, 0xa3, 0x3d, 0xf1, 0xdc, 0x6d, 0xc2, - 0x2b, 0x0d, 0x26, 0x7b, 0xb2, 0x24, 0x01, 0x58, 0xe3, 0xb0, 0xbc, 0xd1, 0xee, 0xc6, 0x86, 0xb0, - 0x32, 0xe9, 0xbc, 0xd1, 0xee, 0xc6, 0x06, 0x66, 0x10, 0xfe, 0xd4, 0x50, 0xb0, 0x25, 0x8e, 0x19, - 0xc6, 0x53, 0x43, 0xc1, 0x16, 0x66, 0x10, 0x3a, 0x4b, 0x7e, 0x10, 0x36, 0x1d, 0xcf, 0x7d, 0x8d, - 0xd4, 0x15, 0x15, 0x71, 0xbc, 0x50, 0xb3, 0x74, 0xa5, 0x1b, 0x05, 0x67, 0xd5, 0xa3, 0x0b, 0xba, - 0x15, 0x92, 0xba, 0x5b, 0x8b, 0xcd, 0xd6, 0x20, 0xb9, 0xa0, 0x57, 0xbb, 0x30, 0x70, 0x46, 0x2d, - 0x34, 0x0b, 0xe3, 0x32, 0x19, 0x8b, 0x4c, 0x60, 0x38, 0x9c, 0xcc, 0x82, 0x86, 0x93, 0x60, 0x9c, - 0xc6, 0xa7, 0x4c, 0xb2, 0x29, 0xd2, 0xaf, 0xb2, 0xd3, 0x88, 0xc1, 0x24, 0x65, 0x5a, 0x56, 0xac, - 0x30, 0xec, 0x0f, 0x16, 0xa9, 0x50, 0xef, 0x91, 0xe5, 0xf8, 0xae, 0xb9, 0x47, 0x27, 0x57, 0xe4, - 0x40, 0x1f, 0x2b, 0xf2, 0x59, 0x18, 0xb9, 0x11, 0x05, 0xbe, 0x72, 0x3d, 0x2e, 0xf5, 0x74, 0x3d, - 0x36, 0xb0, 0xb2, 0x5d, 0x8f, 0x07, 0xf3, 0x72, 0x3d, 0x1e, 0xba, 0x43, 0xd7, 0xe3, 0x3f, 0x2c, - 0x81, 0x7a, 0x4b, 0xf2, 0x0a, 0x89, 0x6f, 0x06, 0xe1, 0x96, 0xeb, 0x37, 0x58, 0x62, 0x91, 0x2f, - 0x58, 0x32, 0x37, 0xc9, 0x92, 0x19, 0x92, 0xbb, 0x91, 0xd3, 0x7b, 0x80, 0x09, 0x62, 0xd3, 0x6b, - 0x06, 0x21, 0xee, 0xc2, 0x92, 0xca, 0x81, 0x22, 0x2e, 0x0d, 0x12, 0x3d, 0x42, 0x3f, 0x0d, 0x20, - 0x4d, 0xf2, 0x1b, 0x92, 0x03, 0x2f, 0xe6, 0xd3, 0x3f, 0x4c, 0x36, 0xb4, 0x4a, 0xbd, 0xa6, 0x88, - 0x60, 0x83, 0x20, 0xfa, 0xa8, 0x0e, 0x57, 0xe6, 0x31, 0x4a, 0xef, 0x3d, 0x92, 0xb1, 0xe9, 0x27, - 0x58, 0x19, 0xc3, 0x90, 0xeb, 0x37, 0xe8, 0x3a, 0x11, 0x2e, 0x9a, 0x6f, 0xcb, 0xca, 0x5b, 0xb5, - 0x14, 0x38, 0xf5, 0x39, 0xc7, 0x73, 0xfc, 0x1a, 0x09, 0x17, 0x39, 0xba, 0x96, 0xa0, 0xa2, 0x00, - 0xcb, 0x86, 0xba, 0x1e, 0xbc, 0x2c, 0xf5, 0xf3, 0xe0, 0xe5, 0xe9, 0x1f, 0x83, 0x89, 0xae, 0xc9, - 0x3c, 0x50, 0x6c, 0xf2, 0x21, 0x32, 0x56, 0xfd, 0xce, 0xa0, 0x16, 0x5a, 0x57, 0x82, 0x3a, 0x7f, - 0x3f, 0x31, 0xd4, 0x33, 0x2a, 0x54, 0xe6, 0x1c, 0x97, 0x88, 0x12, 0x33, 0x46, 0x21, 0x36, 0x49, - 0xd2, 0x35, 0xda, 0x72, 0x42, 0xe2, 0x1f, 0xf5, 0x1a, 0x5d, 0x55, 0x44, 0xb0, 0x41, 0x10, 0x6d, - 0x26, 0x82, 0xe8, 0xce, 0x1f, 0x3e, 0x88, 0x8e, 0x65, 0x11, 0xcd, 0x7a, 0x66, 0xec, 0x75, 0x0b, - 0xc6, 0xfc, 0xc4, 0xca, 0xcd, 0xc7, 0x6f, 0x3e, 0x7b, 0x57, 0xf0, 0xa7, 0x88, 0x93, 0x65, 0x38, - 0x45, 0x3f, 0x4b, 0xa4, 0x95, 0x0e, 0x28, 0xd2, 0xf4, 0xfb, 0xad, 0x83, 0xbd, 0xde, 0x6f, 0x45, - 0xbe, 0x7a, 0x58, 0x7b, 0x28, 0x8f, 0xbc, 0x1f, 0x89, 0x57, 0xb5, 0x21, 0xe3, 0x45, 0xed, 0xeb, - 0x66, 0x8c, 0xed, 0xc1, 0x1f, 0x58, 0x1e, 0xed, 0x15, 0x8b, 0x6b, 0xff, 0xef, 0x01, 0x38, 0x26, - 0x47, 0x44, 0xc6, 0xdc, 0x50, 0xf9, 0xc8, 0xe9, 0x6a, 0x5d, 0x59, 0xc9, 0xc7, 0x8b, 0x12, 0x80, - 0x35, 0x0e, 0xd5, 0xc7, 0xda, 0x11, 0x59, 0x69, 0x11, 0x7f, 0xc9, 0x5d, 0x8f, 0xc4, 0xf5, 0xbb, - 0xda, 0x28, 0x57, 0x35, 0x08, 0x9b, 0x78, 0x2c, 0x10, 0xd8, 0x50, 0x5a, 0xcd, 0x40, 0x60, 0xa1, - 0xa8, 0x4a, 0x38, 0xfa, 0x6c, 0xe6, 0xb3, 0x0b, 0xf9, 0x44, 0xaa, 0x76, 0x85, 0x1a, 0x1d, 0xec, - 0xbd, 0x05, 0xf4, 0x0f, 0x2d, 0x38, 0xc9, 0x4b, 0xe5, 0x48, 0x5e, 0x6d, 0xd5, 0x9d, 0x98, 0x44, - 0xf9, 0x3c, 0x51, 0x95, 0xd1, 0x3f, 0x6d, 0x45, 0xcf, 0x22, 0x8b, 0xb3, 0x7b, 0x83, 0x3e, 0x65, - 0xc1, 0xf8, 0x56, 0x22, 0x79, 0x94, 0x14, 0x1d, 0x87, 0xcd, 0xeb, 0x92, 0x68, 0x54, 0x6f, 0xb5, - 0x64, 0x79, 0x84, 0xd3, 0xd4, 0xed, 0xbf, 0xb2, 0xc0, 0x64, 0xa3, 0x77, 0x3f, 0xe7, 0xd4, 0xc1, - 0x55, 0x41, 0xa9, 0x5d, 0x96, 0x7a, 0x6a, 0x97, 0x8f, 0x40, 0xb1, 0xed, 0xd6, 0xc5, 0xf9, 0x42, - 0x5f, 0xf8, 0x2f, 0x2e, 0x60, 0x5a, 0x6e, 0x7f, 0xb3, 0xa4, 0xcd, 0x20, 0x22, 0x10, 0xf4, 0x7b, - 0xe2, 0xb3, 0x37, 0x54, 0x32, 0x59, 0xfe, 0xe5, 0x57, 0xba, 0x92, 0xc9, 0xfe, 0xc8, 0xc1, 0xe3, - 0x7c, 0xf9, 0x00, 0xf5, 0xca, 0x25, 0x3b, 0xb4, 0x4f, 0x90, 0xef, 0x0d, 0x28, 0xd3, 0x23, 0x18, - 0xb3, 0x67, 0x96, 0x13, 0x9d, 0x2a, 0x5f, 0x14, 0xe5, 0xb7, 0x77, 0xa7, 0x7e, 0xf8, 0xe0, 0xdd, - 0x92, 0xb5, 0xb1, 0x6a, 0x1f, 0x45, 0x50, 0xa1, 0xbf, 0x59, 0x3c, 0xb2, 0x38, 0xdc, 0x5d, 0x55, - 0x3c, 0x53, 0x02, 0x72, 0x09, 0x76, 0xd6, 0x74, 0x90, 0x0f, 0x15, 0x8a, 0xc8, 0x89, 0xf2, 0x33, - 0xe0, 0xaa, 0x8a, 0x0a, 0x96, 0x80, 0xdb, 0xbb, 0x53, 0x2f, 0x1c, 0x9c, 0xa8, 0xaa, 0x8e, 0x35, - 0x09, 0x43, 0x34, 0x0e, 0xf7, 0x7c, 0xda, 0xfc, 0xff, 0x0c, 0xe8, 0xf5, 0x2d, 0xf2, 0x0c, 0x7f, - 0x4f, 0xac, 0xef, 0xe7, 0x53, 0xeb, 0xfb, 0x4c, 0xd7, 0xfa, 0x1e, 0xa3, 0x63, 0x96, 0x91, 0xfd, - 0xf8, 0x6e, 0x2b, 0x0b, 0xfb, 0xdb, 0x24, 0x98, 0x96, 0xf4, 0x6a, 0xdb, 0x0d, 0x49, 0xb4, 0x1a, - 0xb6, 0x7d, 0xd7, 0x6f, 0xb0, 0x25, 0x5b, 0x36, 0xb5, 0xa4, 0x04, 0x18, 0xa7, 0xf1, 0xe9, 0xc1, - 0x9f, 0xae, 0x8b, 0xeb, 0xce, 0x36, 0x5f, 0x79, 0x46, 0x8e, 0xc7, 0xaa, 0x28, 0xc7, 0x0a, 0x03, - 0x6d, 0xc2, 0xc3, 0xb2, 0x81, 0x05, 0xe2, 0x11, 0xfa, 0x41, 0xcc, 0x91, 0x31, 0x6c, 0xf2, 0xb0, - 0x01, 0xee, 0x8b, 0xf2, 0x56, 0xd1, 0xc2, 0xc3, 0x78, 0x0f, 0x5c, 0xbc, 0x67, 0x4b, 0xf6, 0x17, - 0x99, 0xeb, 0x82, 0x91, 0x96, 0x81, 0xae, 0x3e, 0xcf, 0x6d, 0xba, 0x32, 0x15, 0xa5, 0x5a, 0x7d, - 0x4b, 0xb4, 0x10, 0x73, 0x18, 0xba, 0x09, 0x43, 0xeb, 0xfc, 0xc9, 0xf3, 0x7c, 0x9e, 0x1a, 0x12, - 0xef, 0xa7, 0xb3, 0x34, 0xd4, 0xf2, 0x31, 0xf5, 0xdb, 0xfa, 0x27, 0x96, 0xd4, 0xec, 0xaf, 0x95, - 0x60, 0x5c, 0xba, 0x97, 0x5d, 0x74, 0x23, 0xe6, 0x91, 0x60, 0xe6, 0xe6, 0x2f, 0xec, 0x9b, 0x9b, - 0xff, 0x3d, 0x00, 0x75, 0xd2, 0xf2, 0x82, 0x0e, 0x53, 0x0e, 0x07, 0x0e, 0xac, 0x1c, 0xaa, 0xf3, - 0xc4, 0x82, 0x6a, 0x05, 0x1b, 0x2d, 0x8a, 0xfc, 0x9b, 0x3c, 0xd5, 0x7f, 0x2a, 0xff, 0xa6, 0xf1, - 0x20, 0xd9, 0xe0, 0xdd, 0x7d, 0x90, 0xcc, 0x85, 0x71, 0xde, 0x45, 0x95, 0xfc, 0xe0, 0x0e, 0x72, - 0x1c, 0xb0, 0xf0, 0xb1, 0x85, 0x64, 0x33, 0x38, 0xdd, 0xae, 0xf9, 0xda, 0x58, 0xf9, 0x6e, 0xbf, - 0x36, 0xf6, 0x76, 0xa8, 0xc8, 0x79, 0x8e, 0x26, 0x2b, 0x3a, 0x31, 0x8f, 0x5c, 0x06, 0x11, 0xd6, - 0xf0, 0xae, 0x3c, 0x2e, 0x70, 0xaf, 0xf2, 0xb8, 0xd8, 0xaf, 0x17, 0xe9, 0xa9, 0x82, 0xf7, 0xeb, - 0xc0, 0x8f, 0xf5, 0x5d, 0x34, 0x1e, 0xeb, 0x3b, 0xd8, 0x7c, 0x96, 0x53, 0x8f, 0xfa, 0x3d, 0x0c, - 0x03, 0xb1, 0xd3, 0x90, 0xd1, 0xae, 0x0c, 0xba, 0xe6, 0x34, 0x22, 0xcc, 0x4a, 0x0f, 0x92, 0xae, - 0xf8, 0x05, 0x18, 0x8d, 0xdc, 0x86, 0xef, 0xc4, 0xed, 0x90, 0x18, 0xf7, 0x97, 0xda, 0x49, 0xc7, - 0x04, 0xe2, 0x24, 0x2e, 0xfa, 0x90, 0x05, 0x10, 0x12, 0x75, 0x66, 0x19, 0xcc, 0x63, 0x0d, 0x29, - 0x36, 0x20, 0xdb, 0x35, 0xf3, 0x6f, 0xa8, 0xb3, 0x8a, 0x41, 0xd6, 0xfe, 0x88, 0x05, 0x13, 0x5d, - 0xb5, 0x50, 0x0b, 0x06, 0x6b, 0xec, 0x49, 0xc5, 0x7c, 0x12, 0x3c, 0x26, 0x9f, 0x67, 0xe4, 0xc2, - 0x89, 0x97, 0x61, 0x41, 0xc7, 0xfe, 0xf2, 0x08, 0x9c, 0xa8, 0xce, 0x2f, 0xcb, 0x07, 0x76, 0x8e, - 0x2c, 0x7c, 0x37, 0x8b, 0xc6, 0xdd, 0x0b, 0xdf, 0xed, 0x41, 0xdd, 0x33, 0xc2, 0x77, 0x3d, 0x23, - 0x7c, 0x37, 0x19, 0x4b, 0x59, 0xcc, 0x23, 0x96, 0x32, 0xab, 0x07, 0xfd, 0xc4, 0x52, 0x1e, 0x59, - 0x3c, 0xef, 0x9e, 0x1d, 0x3a, 0x50, 0x3c, 0xaf, 0x0a, 0x76, 0xce, 0x25, 0x42, 0xac, 0xc7, 0x54, - 0x65, 0x06, 0x3b, 0xab, 0x40, 0x53, 0x1e, 0xfd, 0x28, 0x84, 0xde, 0xcb, 0xf9, 0x77, 0xa0, 0x8f, - 0x40, 0x53, 0x11, 0x80, 0x69, 0x06, 0x37, 0x0f, 0xe5, 0x11, 0xdc, 0x9c, 0xd5, 0x9d, 0x7d, 0x83, - 0x9b, 0x5f, 0x80, 0xd1, 0x9a, 0x17, 0xf8, 0x64, 0x35, 0x0c, 0xe2, 0xa0, 0x16, 0xc8, 0x07, 0xac, - 0xf5, 0x5b, 0x84, 0x26, 0x10, 0x27, 0x71, 0x7b, 0x45, 0x46, 0x57, 0x0e, 0x1b, 0x19, 0x0d, 0xf7, - 0x28, 0x32, 0xda, 0x88, 0xfd, 0x1d, 0xce, 0x23, 0xf6, 0x37, 0x6b, 0x46, 0xfa, 0x7a, 0xa1, 0xfa, - 0x0d, 0xfe, 0x7e, 0x3b, 0x3d, 0x8c, 0x70, 0x2e, 0xcc, 0xae, 0xe8, 0x86, 0xcf, 0xbe, 0x72, 0x04, - 0x0b, 0xf6, 0x7a, 0x55, 0x93, 0x51, 0x6f, 0xba, 0xeb, 0x22, 0x9c, 0xec, 0xc8, 0x61, 0xc2, 0x92, - 0x3f, 0x57, 0x80, 0xef, 0xdb, 0xb7, 0x0b, 0xe8, 0x26, 0x40, 0xec, 0x34, 0xc4, 0x42, 0x15, 0x17, - 0x59, 0x87, 0xf4, 0x2b, 0x5e, 0x93, 0xed, 0xf1, 0xe4, 0x58, 0xea, 0x2f, 0xbb, 0x22, 0x92, 0xbf, - 0x99, 0x3b, 0x71, 0xe0, 0x75, 0xe5, 0x66, 0xc6, 0x81, 0x47, 0x30, 0x83, 0x50, 0x45, 0x28, 0x24, - 0x0d, 0xaa, 0xdc, 0x17, 0x93, 0x8a, 0x10, 0x66, 0xa5, 0x58, 0x40, 0xd1, 0x73, 0x30, 0xec, 0x78, - 0x1e, 0x0f, 0xdf, 0x23, 0x91, 0x78, 0x24, 0x54, 0x27, 0x89, 0xd5, 0x20, 0x6c, 0xe2, 0xd9, 0x7f, - 0x59, 0x80, 0xa9, 0x7d, 0x78, 0x4a, 0x57, 0xd8, 0x76, 0xa9, 0xef, 0xb0, 0x6d, 0x11, 0xae, 0x34, - 0xd8, 0x23, 0x5c, 0xe9, 0x39, 0x18, 0x8e, 0x89, 0xd3, 0x14, 0x9e, 0x88, 0xe9, 0xdc, 0x87, 0x6b, - 0x1a, 0x84, 0x4d, 0x3c, 0xca, 0xc5, 0xc6, 0x9c, 0x5a, 0x8d, 0x44, 0x91, 0x8c, 0x47, 0x12, 0x56, - 0xee, 0xdc, 0x82, 0x9d, 0xd8, 0xe5, 0xc1, 0x6c, 0x82, 0x04, 0x4e, 0x91, 0x4c, 0x0f, 0x78, 0xa5, - 0xcf, 0x01, 0xff, 0xd5, 0x02, 0x3c, 0xb2, 0xa7, 0x74, 0xeb, 0x3b, 0x54, 0xac, 0x1d, 0x91, 0x30, - 0xbd, 0x70, 0xae, 0x46, 0x24, 0xc4, 0x0c, 0xc2, 0x47, 0xa9, 0xd5, 0x52, 0x5e, 0xe4, 0xf9, 0xc7, - 0x56, 0xf2, 0x51, 0x4a, 0x90, 0xc0, 0x29, 0x92, 0x77, 0xba, 0x2c, 0xbf, 0x36, 0x00, 0x8f, 0xf5, - 0xa1, 0x03, 0xe4, 0x18, 0x83, 0x9a, 0x8c, 0x97, 0x2e, 0xde, 0xa3, 0x78, 0xe9, 0x3b, 0x1b, 0xae, - 0x37, 0xc3, 0xac, 0xfb, 0x8a, 0x75, 0xfd, 0x62, 0x01, 0x4e, 0xf7, 0x56, 0x58, 0xd0, 0x8f, 0xc2, - 0x78, 0xa8, 0x5c, 0x12, 0xcd, 0x50, 0xeb, 0xe3, 0xdc, 0xc6, 0x95, 0x00, 0xe1, 0x34, 0x2e, 0x9a, - 0x06, 0x68, 0x39, 0xf1, 0x66, 0x74, 0x6e, 0xc7, 0x8d, 0x62, 0x91, 0x34, 0x6e, 0x8c, 0xdf, 0xbc, - 0xca, 0x52, 0x6c, 0x60, 0x50, 0x72, 0xec, 0xdf, 0x42, 0x70, 0x25, 0x88, 0x79, 0x25, 0x7e, 0xf4, - 0x3c, 0x2e, 0x5f, 0x14, 0x34, 0x40, 0x38, 0x8d, 0x4b, 0xc9, 0xb1, 0xbb, 0x7d, 0xde, 0x51, 0x7e, - 0x26, 0x65, 0xe4, 0x96, 0x54, 0x29, 0x36, 0x30, 0xd2, 0x41, 0xe4, 0xa5, 0xfd, 0x83, 0xc8, 0xed, - 0x7f, 0x59, 0x80, 0x53, 0x3d, 0x15, 0xde, 0xfe, 0xd8, 0xd4, 0xfd, 0x17, 0xf8, 0x7d, 0x87, 0x3b, - 0xec, 0x40, 0x01, 0xc3, 0xf6, 0x9f, 0xf7, 0x58, 0x69, 0x22, 0x18, 0xf8, 0xce, 0xf3, 0xa0, 0xdc, - 0x7f, 0xe3, 0xd9, 0x15, 0xff, 0x3b, 0x70, 0x80, 0xf8, 0xdf, 0xd4, 0x64, 0x94, 0xfa, 0x94, 0x0e, - 0xff, 0x65, 0xa0, 0xe7, 0xf0, 0xd2, 0x03, 0x72, 0x5f, 0x37, 0x08, 0x0b, 0x70, 0xcc, 0xf5, 0xd9, - 0x1b, 0xb1, 0xd5, 0xf6, 0xba, 0xc8, 0x23, 0xc6, 0x93, 0xe5, 0xaa, 0xe8, 0x9b, 0xc5, 0x14, 0x1c, - 0x77, 0xd5, 0xb8, 0x0f, 0xe3, 0xb1, 0xef, 0x6c, 0x48, 0x0f, 0xc8, 0xb9, 0x57, 0xe0, 0xa4, 0x1c, - 0x8a, 0x4d, 0x27, 0x24, 0x75, 0x21, 0x6c, 0x23, 0x11, 0x6f, 0x75, 0x8a, 0xc7, 0x6c, 0x65, 0x20, - 0xe0, 0xec, 0x7a, 0xec, 0x41, 0xcf, 0xa0, 0xe5, 0xd6, 0xc4, 0x51, 0x50, 0x3f, 0xe8, 0x49, 0x0b, - 0x31, 0x87, 0x69, 0x79, 0x51, 0xb9, 0x3b, 0xf2, 0xe2, 0x3d, 0x50, 0x51, 0xe3, 0xcd, 0x63, 0x2a, - 0xd4, 0x22, 0xef, 0x8a, 0xa9, 0x50, 0x2b, 0xdc, 0xc0, 0xda, 0xef, 0xdd, 0xfc, 0x67, 0x60, 0x44, - 0xd9, 0x02, 0xfb, 0x7d, 0x56, 0xd5, 0xfe, 0xbf, 0x05, 0x48, 0xbd, 0x20, 0x86, 0x76, 0xa0, 0x52, - 0x97, 0x2f, 0xd7, 0xe7, 0x93, 0xac, 0x59, 0x3d, 0x84, 0xaf, 0x2f, 0xc2, 0x54, 0x11, 0xd6, 0xc4, - 0xd0, 0xfb, 0x78, 0x5e, 0x64, 0x41, 0xba, 0x90, 0x47, 0x4c, 0x7e, 0x55, 0xb5, 0x67, 0xbe, 0x9b, - 0x28, 0xcb, 0xb0, 0x41, 0x0f, 0xc5, 0x50, 0xd9, 0x94, 0x2f, 0xa5, 0xe5, 0xc3, 0xee, 0xd4, 0xc3, - 0x6b, 0x5c, 0x45, 0x53, 0x7f, 0xb1, 0x26, 0x64, 0xff, 0x59, 0x01, 0x4e, 0x24, 0x27, 0x40, 0x5c, - 0x5c, 0xfe, 0xba, 0x05, 0x0f, 0x7a, 0x4e, 0x14, 0x57, 0xdb, 0xec, 0xa0, 0xb0, 0xd1, 0xf6, 0x56, - 0x52, 0x29, 0xb4, 0x0f, 0x6b, 0x6c, 0x51, 0x0d, 0xa7, 0x5f, 0xd6, 0x9b, 0x7b, 0xe8, 0xd6, 0xee, - 0xd4, 0x83, 0x4b, 0xd9, 0xc4, 0x71, 0xaf, 0x5e, 0xa1, 0xd7, 0x2d, 0x38, 0x56, 0x6b, 0x87, 0x21, - 0xf1, 0x63, 0xdd, 0x55, 0x3e, 0x8b, 0x57, 0x72, 0x19, 0x48, 0xdd, 0xc1, 0x13, 0x94, 0xa1, 0xce, - 0xa7, 0x68, 0xe1, 0x2e, 0xea, 0xf6, 0x2f, 0x52, 0xc9, 0xd9, 0xf3, 0x3b, 0xff, 0x86, 0x3d, 0x05, - 0xf8, 0x9d, 0x41, 0x18, 0x4d, 0xe4, 0x09, 0x4f, 0x5c, 0xf6, 0x59, 0xfb, 0x5e, 0xf6, 0xb1, 0x08, - 0xc1, 0xb6, 0x2f, 0x5f, 0x49, 0x37, 0x22, 0x04, 0xdb, 0x3e, 0xc1, 0x1c, 0x26, 0x86, 0x14, 0xb7, - 0x7d, 0x11, 0x0b, 0x60, 0x0e, 0x29, 0x6e, 0xfb, 0x58, 0x40, 0xd1, 0x07, 0x2c, 0x18, 0x61, 0x9b, - 0x4f, 0x5c, 0x95, 0x0a, 0x81, 0x76, 0x29, 0x87, 0xed, 0x2e, 0x73, 0xe2, 0x33, 0xdf, 0x51, 0xb3, - 0x04, 0x27, 0x28, 0xa2, 0x0f, 0x5b, 0x50, 0x51, 0x4f, 0xb2, 0x8a, 0xbb, 0x91, 0x6a, 0xbe, 0x69, - 0xd8, 0x53, 0x5c, 0x4f, 0xe5, 0xc3, 0xc6, 0x9a, 0x30, 0x8a, 0xd4, 0x3d, 0xe6, 0xd0, 0xd1, 0xdc, - 0x63, 0x42, 0xc6, 0x1d, 0xe6, 0xdb, 0xa1, 0xd2, 0x74, 0x7c, 0x77, 0x83, 0x44, 0x31, 0xbf, 0x5a, - 0x94, 0xaf, 0x6e, 0xc8, 0x42, 0xac, 0xe1, 0x54, 0xd9, 0x8f, 0xd8, 0x87, 0xc5, 0xc6, 0x5d, 0x20, - 0x53, 0xf6, 0xab, 0xba, 0x18, 0x9b, 0x38, 0xe6, 0xc5, 0x25, 0xdc, 0xd3, 0x8b, 0xcb, 0xe1, 0x7d, - 0x2e, 0x2e, 0xab, 0x70, 0xd2, 0x69, 0xc7, 0xc1, 0x45, 0xe2, 0x78, 0xb3, 0x71, 0x4c, 0x9a, 0xad, - 0x38, 0xe2, 0xa9, 0xe5, 0x47, 0x98, 0x09, 0x58, 0x79, 0xbb, 0x55, 0x89, 0xb7, 0xd1, 0x85, 0x84, - 0xb3, 0xeb, 0xda, 0xff, 0xdc, 0x82, 0x93, 0x99, 0x4b, 0xe1, 0xfe, 0x8d, 0x33, 0xb0, 0x3f, 0x5d, - 0x82, 0xe3, 0x19, 0xaf, 0x08, 0xa0, 0x8e, 0xb9, 0x49, 0xac, 0x3c, 0x5c, 0xf6, 0x92, 0x1e, 0x68, - 0x72, 0x6e, 0x32, 0x76, 0xc6, 0xc1, 0x7c, 0x11, 0xb4, 0x3f, 0x40, 0xf1, 0xee, 0xfa, 0x03, 0x18, - 0x6b, 0x7d, 0xe0, 0x9e, 0xae, 0xf5, 0xd2, 0x3e, 0x6b, 0xfd, 0x4b, 0x16, 0x4c, 0x36, 0x7b, 0x3c, - 0x09, 0x26, 0xee, 0x93, 0xae, 0x1d, 0xcd, 0x83, 0x63, 0x73, 0x0f, 0xdf, 0xda, 0x9d, 0xea, 0xf9, - 0x12, 0x1b, 0xee, 0xd9, 0x2b, 0xfb, 0x5b, 0x45, 0x60, 0xfa, 0x1a, 0xcb, 0x14, 0xdd, 0x41, 0xef, - 0x37, 0x1f, 0x23, 0xb1, 0xf2, 0x7a, 0x38, 0x83, 0x37, 0xae, 0x1e, 0x33, 0xe1, 0x23, 0x98, 0xf5, - 0xb6, 0x49, 0x9a, 0x13, 0x16, 0xfa, 0xe0, 0x84, 0x9e, 0x7c, 0xf5, 0xa5, 0x98, 0xff, 0xab, 0x2f, - 0x95, 0xf4, 0x8b, 0x2f, 0x7b, 0x4f, 0xf1, 0xc0, 0x7d, 0x39, 0xc5, 0xbf, 0x6b, 0x71, 0xc6, 0x93, - 0x9a, 0x05, 0xad, 0x6e, 0x58, 0x7b, 0xa8, 0x1b, 0x4f, 0x42, 0x39, 0x12, 0x9c, 0x59, 0xa8, 0x25, - 0xda, 0x15, 0x4c, 0x94, 0x63, 0x85, 0x41, 0x4f, 0x5d, 0x8e, 0xe7, 0x05, 0x37, 0xcf, 0x35, 0x5b, - 0x71, 0x47, 0x28, 0x28, 0xea, 0x58, 0x30, 0xab, 0x20, 0xd8, 0xc0, 0x42, 0x8f, 0xc1, 0x20, 0xcf, - 0x34, 0x21, 0x8c, 0x3b, 0xc3, 0x74, 0x1f, 0xf2, 0x34, 0x14, 0x75, 0x2c, 0x40, 0xf6, 0x26, 0x18, - 0xa7, 0x8a, 0x3b, 0x7f, 0x66, 0xb9, 0x8f, 0x67, 0xfd, 0xff, 0x7e, 0x41, 0x90, 0xe2, 0xa7, 0x04, - 0xed, 0x19, 0x68, 0x1d, 0xd0, 0x33, 0xf0, 0x7d, 0x00, 0xb5, 0xa0, 0xd9, 0xa2, 0xe7, 0xe6, 0xb5, - 0x20, 0x9f, 0xc3, 0xd6, 0xbc, 0x6a, 0x4f, 0x8f, 0xaa, 0x2e, 0xc3, 0x06, 0xbd, 0x04, 0x6b, 0x2f, - 0xee, 0xcb, 0xda, 0x13, 0x5c, 0x6e, 0x60, 0x6f, 0x2e, 0x67, 0xff, 0xa5, 0x05, 0x09, 0xad, 0x0f, - 0xb5, 0xa0, 0x44, 0xbb, 0xdb, 0x11, 0x0c, 0x63, 0x25, 0x3f, 0x15, 0x93, 0x72, 0x6a, 0xb1, 0x0b, - 0xd9, 0x4f, 0xcc, 0x09, 0x21, 0x4f, 0x78, 0x41, 0xe6, 0x72, 0xf8, 0x31, 0x09, 0x5e, 0x0c, 0x82, - 0x2d, 0xee, 0x4c, 0xa4, 0x3d, 0x2a, 0xed, 0xe7, 0x61, 0xa2, 0xab, 0x53, 0xec, 0x69, 0xe6, 0x40, - 0x9e, 0xe0, 0x8d, 0xdd, 0xc3, 0x12, 0x3e, 0x60, 0x0e, 0xb3, 0xbf, 0x68, 0xc1, 0xb1, 0x74, 0xf3, - 0xe8, 0x0d, 0x0b, 0x26, 0xa2, 0x74, 0x7b, 0x47, 0x35, 0x76, 0x2a, 0xda, 0xa1, 0x0b, 0x84, 0xbb, - 0x3b, 0x61, 0xff, 0x77, 0x21, 0x0d, 0xae, 0xbb, 0x7e, 0x3d, 0xb8, 0xa9, 0xf4, 0x24, 0xab, 0xa7, - 0x9e, 0x44, 0xd9, 0x43, 0x6d, 0x93, 0xd4, 0xdb, 0x5e, 0x57, 0x1a, 0x8a, 0xaa, 0x28, 0xc7, 0x0a, - 0x83, 0x45, 0xdd, 0xb7, 0xc5, 0xb9, 0x35, 0xb5, 0x28, 0x17, 0x44, 0x39, 0x56, 0x18, 0xe8, 0x59, - 0x18, 0x31, 0x3e, 0x52, 0xae, 0x4b, 0x76, 0xe8, 0x30, 0x24, 0x78, 0x84, 0x13, 0x58, 0x68, 0x1a, - 0x40, 0xe9, 0x5c, 0x52, 0x62, 0x33, 0x43, 0xbb, 0x62, 0x8c, 0x11, 0x36, 0x30, 0x58, 0x8e, 0x0b, - 0xaf, 0x1d, 0xb1, 0x9b, 0xe4, 0x41, 0xfd, 0x72, 0xc2, 0xbc, 0x28, 0xc3, 0x0a, 0x4a, 0x99, 0x5b, - 0xd3, 0xf1, 0xdb, 0x8e, 0x47, 0x47, 0x48, 0x98, 0xce, 0xd4, 0x36, 0x5c, 0x56, 0x10, 0x6c, 0x60, - 0xd1, 0x2f, 0x8e, 0xdd, 0x26, 0x79, 0x29, 0xf0, 0xa5, 0x97, 0xba, 0x76, 0x2e, 0x10, 0xe5, 0x58, - 0x61, 0xa0, 0xe7, 0x61, 0xd8, 0xf1, 0xeb, 0x5c, 0x41, 0x0c, 0x42, 0x71, 0x47, 0xa9, 0x4e, 0x9f, - 0x57, 0x23, 0x32, 0xab, 0xa1, 0xd8, 0x44, 0x4d, 0x3f, 0x1b, 0x01, 0x7d, 0x3e, 0x4b, 0xf7, 0x17, - 0x16, 0x8c, 0xeb, 0xa4, 0x45, 0xcc, 0xc2, 0x96, 0x30, 0x2d, 0x5a, 0xfb, 0x9a, 0x16, 0x93, 0xb9, - 0x4b, 0x0a, 0x7d, 0xe5, 0x2e, 0x31, 0xd3, 0x8a, 0x14, 0xf7, 0x4c, 0x2b, 0xf2, 0xfd, 0x30, 0xb4, - 0x45, 0x3a, 0x46, 0xfe, 0x11, 0x26, 0x1c, 0x2e, 0xf3, 0x22, 0x2c, 0x61, 0xc8, 0x86, 0xc1, 0x9a, - 0xa3, 0x72, 0x18, 0x8e, 0x08, 0xdf, 0xb4, 0x59, 0x86, 0x24, 0x20, 0xf6, 0x0a, 0x54, 0xd4, 0xa5, - 0xbe, 0xb4, 0xf4, 0x59, 0xd9, 0x96, 0xbe, 0xbe, 0xd2, 0x1b, 0xcc, 0xad, 0x7f, 0xf5, 0xdb, 0x8f, - 0xbe, 0xe5, 0x8f, 0xbf, 0xfd, 0xe8, 0x5b, 0xfe, 0xf4, 0xdb, 0x8f, 0xbe, 0xe5, 0x03, 0xb7, 0x1e, - 0xb5, 0xbe, 0x7a, 0xeb, 0x51, 0xeb, 0x8f, 0x6f, 0x3d, 0x6a, 0xfd, 0xe9, 0xad, 0x47, 0xad, 0x6f, - 0xdd, 0x7a, 0xd4, 0x7a, 0xfd, 0x3f, 0x3f, 0xfa, 0x96, 0x97, 0x32, 0xe3, 0x22, 0xe8, 0x8f, 0xa7, - 0x6a, 0xf5, 0x99, 0xed, 0x67, 0x98, 0x6b, 0x3e, 0xdd, 0xcf, 0x33, 0xc6, 0x22, 0x9e, 0x91, 0xfb, - 0xf9, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0xe3, 0xbb, 0x00, 0x38, 0x37, 0xff, 0x00, 0x00, + // 12308 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x24, 0xc7, + 0x75, 0x98, 0x66, 0x17, 0x0b, 0xec, 0x3e, 0x7c, 0x1d, 0xfa, 0xee, 0x48, 0xdc, 0xf1, 0x03, 0xe7, + 0xa1, 0x4c, 0xd1, 0x11, 0x09, 0x98, 0x47, 0x52, 0x66, 0x4c, 0x5b, 0x36, 0x3e, 0xee, 0x03, 0x77, + 0xc0, 0x01, 0xec, 0xc5, 0xdd, 0x59, 0x94, 0x29, 0x6a, 0xb0, 0xdb, 0x58, 0xcc, 0x61, 0x76, 0x66, + 0x39, 0x33, 0x8b, 0xc3, 0xd2, 0xb2, 0x2c, 0x59, 0x92, 0x2d, 0x5b, 0x5f, 0x8c, 0xed, 0x8a, 0xa8, + 0x24, 0x52, 0xe4, 0xd8, 0xf9, 0xaa, 0x94, 0xca, 0x4a, 0xfc, 0x23, 0xae, 0xd8, 0x2e, 0x95, 0xed, + 0x94, 0x4a, 0x8e, 0x93, 0xb2, 0xa3, 0x52, 0x2c, 0x27, 0xb6, 0x10, 0xe9, 0x92, 0x94, 0x5c, 0xa9, + 0x8a, 0xab, 0xec, 0xe4, 0x47, 0xea, 0x92, 0x4a, 0xa5, 0xfa, 0xbb, 0x67, 0x76, 0x16, 0x58, 0x1c, + 0x06, 0x77, 0x27, 0x99, 0xff, 0x76, 0xfb, 0xbd, 0x79, 0xaf, 0xa7, 0xa7, 0xfb, 0xbd, 0xd7, 0xaf, + 0xdf, 0x7b, 0x0d, 0x4b, 0x0d, 0x37, 0xde, 0x6c, 0xaf, 0x4f, 0xd7, 0x82, 0xe6, 0x8c, 0x13, 0x36, + 0x82, 0x56, 0x18, 0xdc, 0x60, 0x3f, 0x9e, 0xaa, 0xd5, 0x67, 0xb6, 0x9f, 0x99, 0x69, 0x6d, 0x35, + 0x66, 0x9c, 0x96, 0x1b, 0xcd, 0x38, 0xad, 0x96, 0xe7, 0xd6, 0x9c, 0xd8, 0x0d, 0xfc, 0x99, 0xed, + 0xa7, 0x1d, 0xaf, 0xb5, 0xe9, 0x3c, 0x3d, 0xd3, 0x20, 0x3e, 0x09, 0x9d, 0x98, 0xd4, 0xa7, 0x5b, + 0x61, 0x10, 0x07, 0xe8, 0x87, 0x34, 0xb5, 0x69, 0x49, 0x8d, 0xfd, 0x78, 0xa5, 0x56, 0x9f, 0xde, + 0x7e, 0x66, 0xba, 0xb5, 0xd5, 0x98, 0xa6, 0xd4, 0xa6, 0x0d, 0x6a, 0xd3, 0x92, 0xda, 0xe9, 0xa7, + 0x8c, 0xbe, 0x34, 0x82, 0x46, 0x30, 0xc3, 0x88, 0xae, 0xb7, 0x37, 0xd8, 0x3f, 0xf6, 0x87, 0xfd, + 0xe2, 0xcc, 0x4e, 0xdb, 0x5b, 0xcf, 0x47, 0xd3, 0x6e, 0x40, 0xbb, 0x37, 0x53, 0x0b, 0x42, 0x32, + 0xb3, 0xdd, 0xd5, 0xa1, 0xd3, 0x17, 0x35, 0x0e, 0xd9, 0x89, 0x89, 0x1f, 0xb9, 0x81, 0x1f, 0x3d, + 0x45, 0xbb, 0x40, 0xc2, 0x6d, 0x12, 0x9a, 0xaf, 0x67, 0x20, 0x64, 0x51, 0x7a, 0x56, 0x53, 0x6a, + 0x3a, 0xb5, 0x4d, 0xd7, 0x27, 0x61, 0x47, 0x3f, 0xde, 0x24, 0xb1, 0x93, 0xf5, 0xd4, 0x4c, 0xaf, + 0xa7, 0xc2, 0xb6, 0x1f, 0xbb, 0x4d, 0xd2, 0xf5, 0xc0, 0x3b, 0xf6, 0x7b, 0x20, 0xaa, 0x6d, 0x92, + 0xa6, 0xd3, 0xf5, 0xdc, 0x33, 0xbd, 0x9e, 0x6b, 0xc7, 0xae, 0x37, 0xe3, 0xfa, 0x71, 0x14, 0x87, + 0xe9, 0x87, 0xec, 0xbf, 0x67, 0xc1, 0xe8, 0xec, 0xf5, 0xea, 0x6c, 0x3b, 0xde, 0x9c, 0x0f, 0xfc, + 0x0d, 0xb7, 0x81, 0x9e, 0x83, 0xe1, 0x9a, 0xd7, 0x8e, 0x62, 0x12, 0x5e, 0x71, 0x9a, 0x64, 0xd2, + 0x3a, 0x63, 0x3d, 0x51, 0x99, 0x3b, 0xfe, 0x95, 0xdd, 0xa9, 0xb7, 0xdc, 0xda, 0x9d, 0x1a, 0x9e, + 0xd7, 0x20, 0x6c, 0xe2, 0xa1, 0xef, 0x83, 0xa1, 0x30, 0xf0, 0xc8, 0x2c, 0xbe, 0x32, 0x59, 0x60, + 0x8f, 0x8c, 0x8b, 0x47, 0x86, 0x30, 0x6f, 0xc6, 0x12, 0x4e, 0x51, 0x5b, 0x61, 0xb0, 0xe1, 0x7a, + 0x64, 0xb2, 0x98, 0x44, 0x5d, 0xe5, 0xcd, 0x58, 0xc2, 0xed, 0xcf, 0x14, 0x60, 0x7c, 0xb6, 0xd5, + 0xba, 0x48, 0x1c, 0x2f, 0xde, 0xac, 0xc6, 0x4e, 0xdc, 0x8e, 0x50, 0x03, 0x06, 0x23, 0xf6, 0x4b, + 0xf4, 0x6d, 0x45, 0x3c, 0x3d, 0xc8, 0xe1, 0xb7, 0x77, 0xa7, 0x7e, 0x38, 0x6b, 0x46, 0x37, 0xdc, + 0x38, 0x68, 0x45, 0x4f, 0x11, 0xbf, 0xe1, 0xfa, 0x84, 0x8d, 0xcb, 0x26, 0xa3, 0x3a, 0x6d, 0x12, + 0x9f, 0x0f, 0xea, 0x04, 0x0b, 0xf2, 0xb4, 0x9f, 0x4d, 0x12, 0x45, 0x4e, 0x83, 0xa4, 0x5f, 0x69, + 0x99, 0x37, 0x63, 0x09, 0x47, 0x21, 0x20, 0xcf, 0x89, 0xe2, 0xb5, 0xd0, 0xf1, 0x23, 0x97, 0x4e, + 0xe9, 0x35, 0xb7, 0xc9, 0xdf, 0x6e, 0xf8, 0xec, 0xdf, 0x98, 0xe6, 0x1f, 0x66, 0xda, 0xfc, 0x30, + 0x7a, 0x1d, 0xd0, 0x79, 0x33, 0xbd, 0xfd, 0xf4, 0x34, 0x7d, 0x62, 0xee, 0x81, 0x5b, 0xbb, 0x53, + 0x68, 0xa9, 0x8b, 0x12, 0xce, 0xa0, 0x6e, 0xff, 0x71, 0x01, 0x60, 0xb6, 0xd5, 0x5a, 0x0d, 0x83, + 0x1b, 0xa4, 0x16, 0xa3, 0xf7, 0x42, 0x99, 0x92, 0xaa, 0x3b, 0xb1, 0xc3, 0x06, 0x66, 0xf8, 0xec, + 0xf7, 0xf7, 0xc7, 0x78, 0x65, 0x9d, 0x3e, 0xbf, 0x4c, 0x62, 0x67, 0x0e, 0x89, 0x17, 0x04, 0xdd, + 0x86, 0x15, 0x55, 0xe4, 0xc3, 0x40, 0xd4, 0x22, 0x35, 0x36, 0x18, 0xc3, 0x67, 0x97, 0xa6, 0x0f, + 0xb3, 0xd2, 0xa7, 0x75, 0xcf, 0xab, 0x2d, 0x52, 0x9b, 0x1b, 0x11, 0x9c, 0x07, 0xe8, 0x3f, 0xcc, + 0xf8, 0xa0, 0x6d, 0xf5, 0xa1, 0xf9, 0x40, 0x5e, 0xc9, 0x8d, 0x23, 0xa3, 0x3a, 0x37, 0x96, 0x9c, + 0x38, 0xf2, 0xbb, 0xdb, 0xdf, 0xb0, 0x60, 0x4c, 0x23, 0x2f, 0xb9, 0x51, 0x8c, 0x7e, 0xbc, 0x6b, + 0x70, 0xa7, 0xfb, 0x1b, 0x5c, 0xfa, 0x34, 0x1b, 0xda, 0x63, 0x82, 0x59, 0x59, 0xb6, 0x18, 0x03, + 0xdb, 0x84, 0x92, 0x1b, 0x93, 0x66, 0x34, 0x59, 0x38, 0x53, 0x7c, 0x62, 0xf8, 0xec, 0xc5, 0xbc, + 0xde, 0x73, 0x6e, 0x54, 0x30, 0x2d, 0x2d, 0x52, 0xf2, 0x98, 0x73, 0xb1, 0xff, 0x6a, 0xd4, 0x7c, + 0x3f, 0x3a, 0xe0, 0xe8, 0x69, 0x18, 0x8e, 0x82, 0x76, 0x58, 0x23, 0x98, 0xb4, 0x02, 0xba, 0xb0, + 0x8a, 0x74, 0xba, 0xd3, 0x05, 0x5f, 0xd5, 0xcd, 0xd8, 0xc4, 0x41, 0x9f, 0xb4, 0x60, 0xa4, 0x4e, + 0xa2, 0xd8, 0xf5, 0x19, 0x7f, 0xd9, 0xf9, 0xb5, 0x43, 0x77, 0x5e, 0x36, 0x2e, 0x68, 0xe2, 0x73, + 0x27, 0xc4, 0x8b, 0x8c, 0x18, 0x8d, 0x11, 0x4e, 0xf0, 0xa7, 0x82, 0xab, 0x4e, 0xa2, 0x5a, 0xe8, + 0xb6, 0xe8, 0x7f, 0x21, 0x5a, 0x94, 0xe0, 0x5a, 0xd0, 0x20, 0x6c, 0xe2, 0x21, 0x1f, 0x4a, 0x54, + 0x30, 0x45, 0x93, 0x03, 0xac, 0xff, 0x8b, 0x87, 0xeb, 0xbf, 0x18, 0x54, 0x2a, 0xf3, 0xf4, 0xe8, + 0xd3, 0x7f, 0x11, 0xe6, 0x6c, 0xd0, 0x27, 0x2c, 0x98, 0x14, 0x82, 0x13, 0x13, 0x3e, 0xa0, 0xd7, + 0x37, 0xdd, 0x98, 0x78, 0x6e, 0x14, 0x4f, 0x96, 0x58, 0x1f, 0x66, 0xfa, 0x9b, 0x5b, 0x17, 0xc2, + 0xa0, 0xdd, 0xba, 0xec, 0xfa, 0xf5, 0xb9, 0x33, 0x82, 0xd3, 0xe4, 0x7c, 0x0f, 0xc2, 0xb8, 0x27, + 0x4b, 0xf4, 0x8b, 0x16, 0x9c, 0xf6, 0x9d, 0x26, 0x89, 0x5a, 0x0e, 0xfd, 0xb4, 0x1c, 0x3c, 0xe7, + 0x39, 0xb5, 0x2d, 0xd6, 0xa3, 0xc1, 0x3b, 0xeb, 0x91, 0x2d, 0x7a, 0x74, 0xfa, 0x4a, 0x4f, 0xd2, + 0x78, 0x0f, 0xb6, 0xe8, 0x57, 0x2c, 0x98, 0x08, 0xc2, 0xd6, 0xa6, 0xe3, 0x93, 0xba, 0x84, 0x46, + 0x93, 0x43, 0x6c, 0xe9, 0xbd, 0xe7, 0x70, 0x9f, 0x68, 0x25, 0x4d, 0x76, 0x39, 0xf0, 0xdd, 0x38, + 0x08, 0xab, 0x24, 0x8e, 0x5d, 0xbf, 0x11, 0xcd, 0x9d, 0xbc, 0xb5, 0x3b, 0x35, 0xd1, 0x85, 0x85, + 0xbb, 0xfb, 0x83, 0x7e, 0x02, 0x86, 0xa3, 0x8e, 0x5f, 0xbb, 0xee, 0xfa, 0xf5, 0xe0, 0x66, 0x34, + 0x59, 0xce, 0x63, 0xf9, 0x56, 0x15, 0x41, 0xb1, 0x00, 0x35, 0x03, 0x6c, 0x72, 0xcb, 0xfe, 0x70, + 0x7a, 0x2a, 0x55, 0xf2, 0xfe, 0x70, 0x7a, 0x32, 0xed, 0xc1, 0x16, 0xfd, 0xac, 0x05, 0xa3, 0x91, + 0xdb, 0xf0, 0x9d, 0xb8, 0x1d, 0x92, 0xcb, 0xa4, 0x13, 0x4d, 0x02, 0xeb, 0xc8, 0xa5, 0x43, 0x8e, + 0x8a, 0x41, 0x72, 0xee, 0xa4, 0xe8, 0xe3, 0xa8, 0xd9, 0x1a, 0xe1, 0x24, 0xdf, 0xac, 0x85, 0xa6, + 0xa7, 0xf5, 0x70, 0xbe, 0x0b, 0x4d, 0x4f, 0xea, 0x9e, 0x2c, 0xd1, 0x8f, 0xc2, 0x31, 0xde, 0xa4, + 0x46, 0x36, 0x9a, 0x1c, 0x61, 0x82, 0xf6, 0xc4, 0xad, 0xdd, 0xa9, 0x63, 0xd5, 0x14, 0x0c, 0x77, + 0x61, 0xa3, 0x57, 0x61, 0xaa, 0x45, 0xc2, 0xa6, 0x1b, 0xaf, 0xf8, 0x5e, 0x47, 0x8a, 0xef, 0x5a, + 0xd0, 0x22, 0x75, 0xd1, 0x9d, 0x68, 0x72, 0xf4, 0x8c, 0xf5, 0x44, 0x79, 0xee, 0x6d, 0xa2, 0x9b, + 0x53, 0xab, 0x7b, 0xa3, 0xe3, 0xfd, 0xe8, 0xa1, 0x2f, 0x5b, 0x70, 0xda, 0x90, 0xb2, 0x55, 0x12, + 0x6e, 0xbb, 0x35, 0x32, 0x5b, 0xab, 0x05, 0x6d, 0x3f, 0x8e, 0x26, 0xc7, 0xd8, 0x30, 0xae, 0x1f, + 0x85, 0xcc, 0x4f, 0xb2, 0xd2, 0xf3, 0xb2, 0x27, 0x4a, 0x84, 0xf7, 0xe8, 0xa9, 0xfd, 0xfb, 0x05, + 0x38, 0x96, 0xb6, 0x00, 0xd0, 0x3f, 0xb2, 0x60, 0xfc, 0xc6, 0xcd, 0x78, 0x2d, 0xd8, 0x22, 0x7e, + 0x34, 0xd7, 0xa1, 0x72, 0x9a, 0xe9, 0xbe, 0xe1, 0xb3, 0xb5, 0x7c, 0x6d, 0x8d, 0xe9, 0x4b, 0x49, + 0x2e, 0xe7, 0xfc, 0x38, 0xec, 0xcc, 0x3d, 0x28, 0xde, 0x69, 0xfc, 0xd2, 0xf5, 0x35, 0x13, 0x8a, + 0xd3, 0x9d, 0x3a, 0xfd, 0x31, 0x0b, 0x4e, 0x64, 0x91, 0x40, 0xc7, 0xa0, 0xb8, 0x45, 0x3a, 0xdc, + 0x12, 0xc6, 0xf4, 0x27, 0x7a, 0x19, 0x4a, 0xdb, 0x8e, 0xd7, 0x26, 0xc2, 0x4c, 0xbb, 0x70, 0xb8, + 0x17, 0x51, 0x3d, 0xc3, 0x9c, 0xea, 0x0f, 0x16, 0x9e, 0xb7, 0xec, 0x3f, 0x2c, 0xc2, 0xb0, 0xf1, + 0xd1, 0xee, 0x82, 0xe9, 0x19, 0x24, 0x4c, 0xcf, 0xe5, 0xdc, 0xe6, 0x5b, 0x4f, 0xdb, 0xf3, 0x66, + 0xca, 0xf6, 0x5c, 0xc9, 0x8f, 0xe5, 0x9e, 0xc6, 0x27, 0x8a, 0xa1, 0x12, 0xb4, 0xe8, 0x16, 0x8d, + 0xda, 0x30, 0x03, 0x79, 0x7c, 0xc2, 0x15, 0x49, 0x6e, 0x6e, 0xf4, 0xd6, 0xee, 0x54, 0x45, 0xfd, + 0xc5, 0x9a, 0x91, 0xfd, 0x75, 0x0b, 0x4e, 0x18, 0x7d, 0x9c, 0x0f, 0xfc, 0x3a, 0xdb, 0x68, 0xa0, + 0x33, 0x30, 0x10, 0x77, 0x5a, 0x72, 0x1b, 0xa8, 0x46, 0x6a, 0xad, 0xd3, 0x22, 0x98, 0x41, 0xee, + 0xf7, 0x5d, 0xd2, 0x2f, 0x5a, 0xf0, 0x40, 0xb6, 0x80, 0x41, 0x8f, 0xc3, 0x20, 0xf7, 0x01, 0x88, + 0xb7, 0xd3, 0x9f, 0x84, 0xb5, 0x62, 0x01, 0x45, 0x33, 0x50, 0x51, 0x0a, 0x4f, 0xbc, 0xe3, 0x84, + 0x40, 0xad, 0x68, 0x2d, 0xa9, 0x71, 0xe8, 0xa0, 0xd1, 0x3f, 0xc2, 0x04, 0x55, 0x83, 0xc6, 0x36, + 0xcd, 0x0c, 0x62, 0x7f, 0xcd, 0x82, 0xb7, 0xf6, 0x23, 0xf6, 0x8e, 0xae, 0x8f, 0x55, 0x38, 0x59, + 0x27, 0x1b, 0x4e, 0xdb, 0x8b, 0x93, 0x1c, 0x45, 0xa7, 0x1f, 0x11, 0x0f, 0x9f, 0x5c, 0xc8, 0x42, + 0xc2, 0xd9, 0xcf, 0xda, 0xff, 0xd9, 0x62, 0xdb, 0x75, 0xf9, 0x5a, 0x77, 0x61, 0xeb, 0xe4, 0x27, + 0xb7, 0x4e, 0x8b, 0xb9, 0x2d, 0xd3, 0x1e, 0x7b, 0xa7, 0x4f, 0x58, 0x70, 0xda, 0xc0, 0x5a, 0x76, + 0xe2, 0xda, 0xe6, 0xb9, 0x9d, 0x56, 0x48, 0xa2, 0x88, 0x4e, 0xa9, 0x47, 0x0c, 0x71, 0x3c, 0x37, + 0x2c, 0x28, 0x14, 0x2f, 0x93, 0x0e, 0x97, 0xcd, 0x4f, 0x42, 0x99, 0xaf, 0xb9, 0x20, 0x14, 0x1f, + 0x49, 0xbd, 0xdb, 0x8a, 0x68, 0xc7, 0x0a, 0x03, 0xd9, 0x30, 0xc8, 0x64, 0x2e, 0x95, 0x41, 0xd4, + 0x4c, 0x00, 0xfa, 0xdd, 0xaf, 0xb1, 0x16, 0x2c, 0x20, 0x76, 0x94, 0xe8, 0xce, 0x6a, 0x48, 0xd8, + 0x7c, 0xa8, 0x9f, 0x77, 0x89, 0x57, 0x8f, 0xe8, 0xb6, 0xce, 0xf1, 0xfd, 0x20, 0x16, 0x3b, 0x34, + 0x63, 0x5b, 0x37, 0xab, 0x9b, 0xb1, 0x89, 0x43, 0x99, 0x7a, 0xce, 0x3a, 0xf1, 0xf8, 0x88, 0x0a, + 0xa6, 0x4b, 0xac, 0x05, 0x0b, 0x88, 0x7d, 0xab, 0xc0, 0x36, 0x90, 0x4a, 0xa2, 0x91, 0xbb, 0xe1, + 0x7d, 0x08, 0x13, 0x2a, 0x60, 0x35, 0x3f, 0x79, 0x4c, 0x7a, 0x7b, 0x20, 0x5e, 0x4b, 0x69, 0x01, + 0x9c, 0x2b, 0xd7, 0xbd, 0xbd, 0x10, 0x1f, 0x28, 0xc2, 0x54, 0xf2, 0x81, 0x2e, 0x25, 0x42, 0xb7, + 0xbc, 0x06, 0xa3, 0xb4, 0xaf, 0xce, 0xc0, 0xc7, 0x26, 0x5e, 0x0f, 0x39, 0x5c, 0x38, 0x4a, 0x39, + 0x6c, 0xaa, 0x89, 0xe2, 0x3e, 0x6a, 0xe2, 0x71, 0x35, 0xea, 0x03, 0x29, 0x99, 0x97, 0x54, 0x95, + 0x67, 0x60, 0x20, 0x8a, 0x49, 0x6b, 0xb2, 0x94, 0x14, 0xb3, 0xd5, 0x98, 0xb4, 0x30, 0x83, 0xa0, + 0x1f, 0x86, 0xf1, 0xd8, 0x09, 0x1b, 0x24, 0x0e, 0xc9, 0xb6, 0xcb, 0xfc, 0xba, 0x6c, 0x3f, 0x5b, + 0x99, 0x3b, 0x4e, 0xad, 0xae, 0x35, 0x06, 0xc2, 0x12, 0x84, 0xd3, 0xb8, 0xf6, 0x7f, 0x2f, 0xc0, + 0x83, 0xc9, 0x4f, 0xa0, 0x15, 0xe3, 0x8f, 0x24, 0x14, 0xe3, 0xdb, 0x4d, 0xc5, 0x78, 0x7b, 0x77, + 0xea, 0xa1, 0x1e, 0x8f, 0x7d, 0xc7, 0xe8, 0x4d, 0x74, 0x21, 0xf5, 0x11, 0x66, 0xba, 0xbc, 0xac, + 0x8f, 0xf4, 0x78, 0xc7, 0xd4, 0x57, 0x7a, 0x1c, 0x06, 0x43, 0xe2, 0x44, 0x81, 0x2f, 0xbe, 0x93, + 0xfa, 0x9a, 0x98, 0xb5, 0x62, 0x01, 0xb5, 0xbf, 0x5a, 0x49, 0x0f, 0xf6, 0x05, 0xee, 0xab, 0x0e, + 0x42, 0xe4, 0xc2, 0x00, 0xdb, 0xb5, 0x71, 0xc9, 0x72, 0xf9, 0x70, 0xab, 0x90, 0x6a, 0x11, 0x45, + 0x7a, 0xae, 0x4c, 0xbf, 0x1a, 0x6d, 0xc2, 0x8c, 0x05, 0xda, 0x81, 0x72, 0x4d, 0x6e, 0xa6, 0x0a, + 0x79, 0xb8, 0x1d, 0xc5, 0x56, 0x4a, 0x73, 0x1c, 0xa1, 0xe2, 0x5e, 0xed, 0xc0, 0x14, 0x37, 0x44, + 0xa0, 0xd8, 0x70, 0x63, 0xf1, 0x59, 0x0f, 0xb9, 0x5d, 0xbe, 0xe0, 0x1a, 0xaf, 0x38, 0x44, 0x75, + 0xd0, 0x05, 0x37, 0xc6, 0x94, 0x3e, 0xfa, 0x88, 0x05, 0xc3, 0x51, 0xad, 0xb9, 0x1a, 0x06, 0xdb, + 0x6e, 0x9d, 0x84, 0xc2, 0xc6, 0x3c, 0xa4, 0x64, 0xab, 0xce, 0x2f, 0x4b, 0x82, 0x9a, 0x2f, 0x77, + 0x5f, 0x68, 0x08, 0x36, 0xf9, 0xd2, 0xbd, 0xd7, 0x83, 0xe2, 0xdd, 0x17, 0x48, 0x8d, 0xad, 0x38, + 0xb9, 0x67, 0x66, 0x33, 0xe5, 0xd0, 0x36, 0xf7, 0x42, 0xbb, 0xb6, 0x45, 0xd7, 0x9b, 0xee, 0xd0, + 0x43, 0xb7, 0x76, 0xa7, 0x1e, 0x9c, 0xcf, 0xe6, 0x89, 0x7b, 0x75, 0x86, 0x0d, 0x58, 0xab, 0xed, + 0x79, 0x98, 0xbc, 0xda, 0x26, 0xcc, 0x23, 0x96, 0xc3, 0x80, 0xad, 0x6a, 0x82, 0xa9, 0x01, 0x33, + 0x20, 0xd8, 0xe4, 0x8b, 0x5e, 0x85, 0xc1, 0xa6, 0x13, 0x87, 0xee, 0x8e, 0x70, 0x83, 0x1d, 0x72, + 0x17, 0xb4, 0xcc, 0x68, 0x69, 0xe6, 0x4c, 0xd1, 0xf3, 0x46, 0x2c, 0x18, 0xa1, 0x26, 0x94, 0x9a, + 0x24, 0x6c, 0x90, 0xc9, 0x72, 0x1e, 0x2e, 0xff, 0x65, 0x4a, 0x4a, 0x33, 0xac, 0x50, 0xe3, 0x8a, + 0xb5, 0x61, 0xce, 0x05, 0xbd, 0x0c, 0xe5, 0x88, 0x78, 0xa4, 0x46, 0xcd, 0xa3, 0x0a, 0xe3, 0xf8, + 0x4c, 0x9f, 0xa6, 0x22, 0xb5, 0x4b, 0xaa, 0xe2, 0x51, 0xbe, 0xc0, 0xe4, 0x3f, 0xac, 0x48, 0xd2, + 0x01, 0x6c, 0x79, 0xed, 0x86, 0xeb, 0x4f, 0x42, 0x1e, 0x03, 0xb8, 0xca, 0x68, 0xa5, 0x06, 0x90, + 0x37, 0x62, 0xc1, 0xc8, 0xfe, 0x6f, 0x16, 0xa0, 0xa4, 0x50, 0xbb, 0x0b, 0x36, 0xf1, 0xab, 0x49, + 0x9b, 0x78, 0x29, 0x4f, 0xa3, 0xa5, 0x87, 0x59, 0xfc, 0x9b, 0x15, 0x48, 0xa9, 0x83, 0x2b, 0x24, + 0x8a, 0x49, 0xfd, 0x4d, 0x11, 0xfe, 0xa6, 0x08, 0x7f, 0x53, 0x84, 0x2b, 0x11, 0xbe, 0x9e, 0x12, + 0xe1, 0xef, 0x34, 0x56, 0xbd, 0x8e, 0x3d, 0x78, 0x45, 0x05, 0x27, 0x98, 0x3d, 0x30, 0x10, 0xa8, + 0x24, 0xb8, 0x54, 0x5d, 0xb9, 0x92, 0x29, 0xb3, 0x5f, 0x49, 0xca, 0xec, 0xc3, 0xb2, 0xf8, 0xeb, + 0x20, 0xa5, 0xbf, 0x6c, 0xc1, 0xdb, 0x92, 0xd2, 0x4b, 0xce, 0x9c, 0xc5, 0x86, 0x1f, 0x84, 0x64, + 0xc1, 0xdd, 0xd8, 0x20, 0x21, 0xf1, 0x6b, 0x24, 0x52, 0xbe, 0x1d, 0xab, 0x97, 0x6f, 0x07, 0x3d, + 0x0b, 0x23, 0x37, 0xa2, 0xc0, 0x5f, 0x0d, 0x5c, 0x5f, 0x88, 0x20, 0xba, 0xe3, 0x38, 0x76, 0x6b, + 0x77, 0x6a, 0x84, 0x8e, 0xa8, 0x6c, 0xc7, 0x09, 0x2c, 0x34, 0x0f, 0x13, 0x37, 0x5e, 0x5d, 0x75, + 0x62, 0xc3, 0x9b, 0x20, 0xf7, 0xfd, 0xec, 0x3c, 0xea, 0xd2, 0x8b, 0x29, 0x20, 0xee, 0xc6, 0xb7, + 0xff, 0x6e, 0x01, 0x4e, 0xa5, 0x5e, 0x24, 0xf0, 0xbc, 0xa0, 0x1d, 0xd3, 0x3d, 0x11, 0xfa, 0x9c, + 0x05, 0xc7, 0x9a, 0x49, 0x87, 0x45, 0x24, 0xdc, 0xdd, 0x3f, 0x96, 0x9b, 0x8e, 0x48, 0x79, 0x44, + 0xe6, 0x26, 0xc5, 0x08, 0x1d, 0x4b, 0x01, 0x22, 0xdc, 0xd5, 0x17, 0xf4, 0x32, 0x54, 0x9a, 0xce, + 0xce, 0xd5, 0x56, 0xdd, 0x89, 0xe5, 0x76, 0xb4, 0xb7, 0x17, 0xa1, 0x1d, 0xbb, 0xde, 0x34, 0x8f, + 0x6a, 0x99, 0x5e, 0xf4, 0xe3, 0x95, 0xb0, 0x1a, 0x87, 0xae, 0xdf, 0xe0, 0x4e, 0xce, 0x65, 0x49, + 0x06, 0x6b, 0x8a, 0xf6, 0x67, 0xad, 0xb4, 0x92, 0x52, 0xa3, 0x13, 0x3a, 0x31, 0x69, 0x74, 0xd0, + 0xfb, 0xa0, 0x44, 0xf7, 0x8d, 0x72, 0x54, 0xae, 0xe7, 0xa9, 0x39, 0x8d, 0x2f, 0xa1, 0x95, 0x28, + 0xfd, 0x17, 0x61, 0xce, 0xd4, 0xfe, 0x5c, 0x25, 0x6d, 0x2c, 0xb0, 0xb3, 0xf9, 0xb3, 0x00, 0x8d, + 0x60, 0x8d, 0x34, 0x5b, 0x1e, 0x1d, 0x16, 0x8b, 0x1d, 0xf0, 0x28, 0x57, 0xc9, 0x05, 0x05, 0xc1, + 0x06, 0x16, 0xfa, 0x39, 0x0b, 0xa0, 0x21, 0xe7, 0xbc, 0x34, 0x04, 0xae, 0xe6, 0xf9, 0x3a, 0x7a, + 0x45, 0xe9, 0xbe, 0x28, 0x86, 0xd8, 0x60, 0x8e, 0x7e, 0xda, 0x82, 0x72, 0x2c, 0xbb, 0xcf, 0x55, + 0xe3, 0x5a, 0x9e, 0x3d, 0x91, 0x2f, 0xad, 0x6d, 0x22, 0x35, 0x24, 0x8a, 0x2f, 0xfa, 0x19, 0x0b, + 0x20, 0xea, 0xf8, 0xb5, 0xd5, 0xc0, 0x73, 0x6b, 0x1d, 0xa1, 0x31, 0xaf, 0xe5, 0xea, 0xce, 0x51, + 0xd4, 0xe7, 0xc6, 0xe8, 0x68, 0xe8, 0xff, 0xd8, 0xe0, 0x8c, 0xde, 0x0f, 0xe5, 0x48, 0x4c, 0x37, + 0xa1, 0x23, 0xd7, 0xf2, 0x75, 0x2a, 0x71, 0xda, 0x42, 0xbc, 0x8a, 0x7f, 0x58, 0xf1, 0x44, 0x9f, + 0xb6, 0x60, 0xbc, 0x95, 0x74, 0x13, 0x0a, 0x75, 0x98, 0x9f, 0x0c, 0x48, 0xb9, 0x21, 0xb9, 0xb7, + 0x25, 0xd5, 0x88, 0xd3, 0xbd, 0xa0, 0x12, 0x50, 0xcf, 0xe0, 0x95, 0x16, 0x77, 0x59, 0x0e, 0x69, + 0x09, 0x78, 0x21, 0x0d, 0xc4, 0xdd, 0xf8, 0x68, 0x15, 0x4e, 0xd0, 0xde, 0x75, 0xb8, 0xf9, 0x29, + 0xd5, 0x4b, 0xc4, 0x94, 0x61, 0x79, 0xee, 0x61, 0x31, 0x43, 0xd8, 0x59, 0x47, 0x1a, 0x07, 0x67, + 0x3e, 0x89, 0xfe, 0xd0, 0x82, 0x87, 0x5d, 0xa6, 0x06, 0x4c, 0x87, 0xbd, 0xd6, 0x08, 0xe2, 0xa0, + 0x9d, 0xe4, 0x2a, 0x2b, 0x7a, 0xa9, 0x9f, 0xb9, 0xb7, 0x8a, 0x37, 0x78, 0x78, 0x71, 0x8f, 0x2e, + 0xe1, 0x3d, 0x3b, 0x8c, 0x7e, 0x00, 0x46, 0xe5, 0xba, 0x58, 0xa5, 0x22, 0x98, 0x29, 0xda, 0xca, + 0xdc, 0xc4, 0xad, 0xdd, 0xa9, 0xd1, 0x35, 0x13, 0x80, 0x93, 0x78, 0xf6, 0xbf, 0x29, 0x26, 0x4e, + 0x89, 0x94, 0x0f, 0x93, 0x89, 0x9b, 0x9a, 0xf4, 0xff, 0x48, 0xe9, 0x99, 0xab, 0xb8, 0x51, 0xde, + 0x25, 0x2d, 0x6e, 0x54, 0x53, 0x84, 0x0d, 0xe6, 0xd4, 0x28, 0x9d, 0x70, 0xd2, 0x9e, 0x52, 0x21, + 0x01, 0x5f, 0xce, 0xb3, 0x4b, 0xdd, 0x67, 0x7a, 0xa7, 0x44, 0xd7, 0x26, 0xba, 0x40, 0xb8, 0xbb, + 0x4b, 0xe8, 0x27, 0xa1, 0x12, 0xaa, 0xc8, 0x96, 0x62, 0x1e, 0x5b, 0x35, 0x39, 0x6d, 0x44, 0x77, + 0xd4, 0x01, 0x90, 0x8e, 0x61, 0xd1, 0x1c, 0xed, 0x3f, 0x48, 0x1e, 0x8c, 0x19, 0xb2, 0xa3, 0x8f, + 0x43, 0xbf, 0x4f, 0x5a, 0x30, 0x1c, 0x06, 0x9e, 0xe7, 0xfa, 0x0d, 0x2a, 0xe7, 0x84, 0xb2, 0x7e, + 0xf7, 0x91, 0xe8, 0x4b, 0x21, 0xd0, 0x98, 0x65, 0x8d, 0x35, 0x4f, 0x6c, 0x76, 0xc0, 0xfe, 0x86, + 0x05, 0x93, 0xbd, 0xe4, 0x31, 0x22, 0xf0, 0x90, 0x14, 0x36, 0x6a, 0x28, 0x56, 0xfc, 0x05, 0xe2, + 0x11, 0xe5, 0x36, 0x2f, 0xcf, 0x3d, 0x26, 0x5e, 0xf3, 0xa1, 0xd5, 0xde, 0xa8, 0x78, 0x2f, 0x3a, + 0xe8, 0x25, 0x38, 0x66, 0xbc, 0x57, 0xa4, 0x06, 0xa6, 0x32, 0x37, 0x4d, 0x0d, 0xa0, 0xd9, 0x14, + 0xec, 0xf6, 0xee, 0xd4, 0x03, 0xe9, 0x36, 0xa1, 0x30, 0xba, 0xe8, 0xd8, 0xbf, 0x5a, 0x48, 0x7f, + 0x2d, 0xa5, 0xeb, 0xdf, 0xb0, 0xba, 0xbc, 0x09, 0x3f, 0x76, 0x14, 0xfa, 0x95, 0xf9, 0x1d, 0x54, + 0x18, 0x46, 0x6f, 0x9c, 0x7b, 0x78, 0x6c, 0x6f, 0xff, 0xdb, 0x01, 0xd8, 0xa3, 0x67, 0x7d, 0x18, + 0xef, 0x07, 0x3e, 0x47, 0xfd, 0xb8, 0xa5, 0x0e, 0xcc, 0xf8, 0x1a, 0xae, 0x1f, 0xd5, 0xd8, 0xf3, + 0xfd, 0x53, 0xc4, 0x43, 0x47, 0x94, 0x17, 0x3d, 0x79, 0x34, 0x87, 0x3e, 0x6f, 0x25, 0x8f, 0xfc, + 0x78, 0x50, 0xa3, 0x7b, 0x64, 0x7d, 0x32, 0xce, 0x11, 0x79, 0xc7, 0xf4, 0xe9, 0x53, 0xaf, 0x13, + 0xc6, 0x69, 0x80, 0x0d, 0xd7, 0x77, 0x3c, 0xf7, 0x35, 0xba, 0x3b, 0x2a, 0x31, 0x05, 0xcf, 0x2c, + 0xa6, 0xf3, 0xaa, 0x15, 0x1b, 0x18, 0xa7, 0xff, 0x26, 0x0c, 0x1b, 0x6f, 0x9e, 0x11, 0xf1, 0x72, + 0xc2, 0x8c, 0x78, 0xa9, 0x18, 0x81, 0x2a, 0xa7, 0xdf, 0x09, 0xc7, 0xd2, 0x1d, 0x3c, 0xc8, 0xf3, + 0xf6, 0xff, 0x1e, 0x4a, 0x9f, 0xc1, 0xad, 0x91, 0xb0, 0x49, 0xbb, 0xf6, 0xa6, 0x63, 0xeb, 0x4d, + 0xc7, 0xd6, 0x9b, 0x8e, 0x2d, 0xf3, 0x6c, 0x42, 0x38, 0x6d, 0x86, 0xee, 0x92, 0xd3, 0x26, 0xe1, + 0x86, 0x2a, 0xe7, 0xee, 0x86, 0xb2, 0x3f, 0xd2, 0xe5, 0xb9, 0x5f, 0x0b, 0x09, 0x41, 0x01, 0x94, + 0xfc, 0xa0, 0x4e, 0xa4, 0x8d, 0x7b, 0x29, 0x1f, 0x83, 0xed, 0x4a, 0x50, 0x37, 0xc2, 0xc5, 0xe9, + 0xbf, 0x08, 0x73, 0x3e, 0xf6, 0x87, 0x07, 0x21, 0x61, 0x4e, 0xf2, 0xef, 0xfe, 0x7d, 0x30, 0x14, + 0x92, 0x56, 0x70, 0x15, 0x2f, 0x09, 0x5d, 0xa6, 0xb3, 0x6d, 0x78, 0x33, 0x96, 0x70, 0xaa, 0xf3, + 0x5a, 0x4e, 0xbc, 0x29, 0x94, 0x99, 0xd2, 0x79, 0xab, 0x4e, 0xbc, 0x89, 0x19, 0x04, 0xbd, 0x13, + 0xc6, 0xe2, 0xc4, 0x51, 0xb8, 0x38, 0xf2, 0x7d, 0x40, 0xe0, 0x8e, 0x25, 0x0f, 0xca, 0x71, 0x0a, + 0x1b, 0xbd, 0x0a, 0x03, 0x9b, 0xc4, 0x6b, 0x8a, 0x4f, 0x5f, 0xcd, 0x4f, 0xd7, 0xb0, 0x77, 0xbd, + 0x48, 0xbc, 0x26, 0x97, 0x84, 0xf4, 0x17, 0x66, 0xac, 0xe8, 0xbc, 0xaf, 0x6c, 0xb5, 0xa3, 0x38, + 0x68, 0xba, 0xaf, 0x49, 0x4f, 0xe7, 0x8f, 0xe5, 0xcc, 0xf8, 0xb2, 0xa4, 0xcf, 0x5d, 0x4a, 0xea, + 0x2f, 0xd6, 0x9c, 0x59, 0x3f, 0xea, 0x6e, 0xc8, 0xa6, 0x4c, 0x47, 0x38, 0x2c, 0xf3, 0xee, 0xc7, + 0x82, 0xa4, 0xcf, 0xfb, 0xa1, 0xfe, 0x62, 0xcd, 0x19, 0x75, 0xd4, 0xfa, 0x1b, 0x66, 0x7d, 0xb8, + 0x9a, 0x73, 0x1f, 0xf8, 0xda, 0xcb, 0x5c, 0x87, 0x8f, 0x41, 0xa9, 0xb6, 0xe9, 0x84, 0xf1, 0xe4, + 0x08, 0x9b, 0x34, 0x6a, 0x16, 0xcf, 0xd3, 0x46, 0xcc, 0x61, 0xe8, 0x11, 0x28, 0x86, 0x64, 0x83, + 0x45, 0x27, 0x1b, 0x71, 0x51, 0x98, 0x6c, 0x60, 0xda, 0xae, 0xec, 0xb2, 0xb1, 0x9e, 0x01, 0x73, + 0xbf, 0x5c, 0x48, 0x1a, 0x76, 0xc9, 0x91, 0xe1, 0xeb, 0xa1, 0xd6, 0x0e, 0x23, 0xe9, 0x20, 0x33, + 0xd6, 0x03, 0x6b, 0xc6, 0x12, 0x8e, 0x3e, 0x68, 0xc1, 0xd0, 0x8d, 0x28, 0xf0, 0x7d, 0x12, 0x0b, + 0x25, 0x7a, 0x2d, 0xe7, 0xc1, 0xba, 0xc4, 0xa9, 0xeb, 0x3e, 0x88, 0x06, 0x2c, 0xf9, 0xd2, 0xee, + 0x92, 0x9d, 0x9a, 0xd7, 0xae, 0x77, 0x05, 0xc3, 0x9c, 0xe3, 0xcd, 0x58, 0xc2, 0x29, 0xaa, 0xeb, + 0x73, 0xd4, 0x81, 0x24, 0xea, 0xa2, 0x2f, 0x50, 0x05, 0xdc, 0xfe, 0xf5, 0x32, 0x9c, 0xcc, 0x5c, + 0x3e, 0xd4, 0xe4, 0x62, 0x46, 0xcd, 0x79, 0xd7, 0x23, 0x32, 0x0c, 0x8c, 0x99, 0x5c, 0xd7, 0x54, + 0x2b, 0x36, 0x30, 0xd0, 0x4f, 0x01, 0xb4, 0x9c, 0xd0, 0x69, 0x12, 0xe5, 0xc0, 0x3e, 0xb4, 0x65, + 0x43, 0xfb, 0xb1, 0x2a, 0x69, 0xea, 0x4d, 0xbc, 0x6a, 0x8a, 0xb0, 0xc1, 0x12, 0x3d, 0x07, 0xc3, + 0x21, 0xf1, 0x88, 0x13, 0xb1, 0xf0, 0xf7, 0x74, 0x2e, 0x0f, 0xd6, 0x20, 0x6c, 0xe2, 0xa1, 0xc7, + 0x55, 0xc4, 0x5c, 0x2a, 0x72, 0x28, 0x19, 0x35, 0x87, 0x3e, 0x65, 0xc1, 0xd8, 0x86, 0xeb, 0x11, + 0xcd, 0x5d, 0x64, 0xde, 0xac, 0x1c, 0xfe, 0x25, 0xcf, 0x9b, 0x74, 0xb5, 0x0c, 0x4d, 0x34, 0x47, + 0x38, 0xc5, 0x9e, 0x7e, 0xe6, 0x6d, 0x12, 0x32, 0xe1, 0x3b, 0x98, 0xfc, 0xcc, 0xd7, 0x78, 0x33, + 0x96, 0x70, 0x34, 0x0b, 0xe3, 0x2d, 0x27, 0x8a, 0xe6, 0x43, 0x52, 0x27, 0x7e, 0xec, 0x3a, 0x1e, + 0xcf, 0x8b, 0x29, 0xeb, 0x70, 0xf2, 0xd5, 0x24, 0x18, 0xa7, 0xf1, 0xd1, 0xbb, 0xe0, 0x41, 0xee, + 0x21, 0x5a, 0x76, 0xa3, 0xc8, 0xf5, 0x1b, 0x7a, 0x1a, 0x08, 0x47, 0xd9, 0x94, 0x20, 0xf5, 0xe0, + 0x62, 0x36, 0x1a, 0xee, 0xf5, 0x3c, 0x7a, 0x12, 0xca, 0xd1, 0x96, 0xdb, 0x9a, 0x0f, 0xeb, 0x11, + 0x3b, 0x1d, 0x2a, 0x6b, 0xb7, 0x6c, 0x55, 0xb4, 0x63, 0x85, 0x81, 0x6a, 0x30, 0xc2, 0x3f, 0x09, + 0x0f, 0xf9, 0x13, 0x12, 0xf4, 0xa9, 0x9e, 0x8a, 0x5c, 0xa4, 0xc0, 0x4e, 0x63, 0xe7, 0xe6, 0x39, + 0x79, 0x56, 0xc5, 0x8f, 0x56, 0xae, 0x19, 0x64, 0x70, 0x82, 0x68, 0x72, 0x4f, 0x37, 0xdc, 0xc7, + 0x9e, 0xee, 0x39, 0x18, 0xde, 0x6a, 0xaf, 0x13, 0x31, 0xf2, 0x42, 0xb0, 0xa9, 0xd9, 0x77, 0x59, + 0x83, 0xb0, 0x89, 0xc7, 0xa2, 0x2d, 0x5b, 0xae, 0xf8, 0x17, 0x4d, 0x8e, 0x1a, 0xd1, 0x96, 0xab, + 0x8b, 0xb2, 0x19, 0x9b, 0x38, 0xb4, 0x6b, 0x74, 0x2c, 0xd6, 0x48, 0xc4, 0x92, 0x29, 0xe8, 0x70, + 0xa9, 0xae, 0x55, 0x25, 0x00, 0x6b, 0x1c, 0xb4, 0x0a, 0x27, 0xe8, 0x9f, 0x2a, 0x4b, 0x01, 0xbe, + 0xe6, 0x78, 0x6e, 0x9d, 0x87, 0xfe, 0x8d, 0x27, 0xfd, 0x9b, 0xd5, 0x0c, 0x1c, 0x9c, 0xf9, 0xa4, + 0xfd, 0x99, 0x42, 0xd2, 0x73, 0x62, 0x8a, 0x30, 0x14, 0x51, 0x41, 0x15, 0x5f, 0x73, 0x42, 0x69, + 0xf0, 0x1c, 0x32, 0xb9, 0x49, 0xd0, 0xbd, 0xe6, 0x84, 0xa6, 0xc8, 0x63, 0x0c, 0xb0, 0xe4, 0x84, + 0x6e, 0xc0, 0x40, 0xec, 0x39, 0x39, 0x65, 0x43, 0x1a, 0x1c, 0xb5, 0x23, 0x6b, 0x69, 0x36, 0xc2, + 0x8c, 0x07, 0x7a, 0x98, 0xee, 0xde, 0xd6, 0xe5, 0x49, 0x9b, 0xd8, 0x70, 0xad, 0x47, 0x98, 0xb5, + 0xda, 0xbf, 0x34, 0x9a, 0xa1, 0x75, 0x94, 0x21, 0x80, 0xce, 0x02, 0xd0, 0x49, 0xb3, 0x1a, 0x92, + 0x0d, 0x77, 0x47, 0x18, 0x62, 0x4a, 0xb2, 0x5d, 0x51, 0x10, 0x6c, 0x60, 0xc9, 0x67, 0xaa, 0xed, + 0x0d, 0xfa, 0x4c, 0xa1, 0xfb, 0x19, 0x0e, 0xc1, 0x06, 0x16, 0x7a, 0x16, 0x06, 0xdd, 0xa6, 0xd3, + 0x50, 0x81, 0xc0, 0x0f, 0x53, 0x91, 0xb6, 0xc8, 0x5a, 0x6e, 0xef, 0x4e, 0x8d, 0xa9, 0x0e, 0xb1, + 0x26, 0x2c, 0x70, 0xd1, 0xaf, 0x5a, 0x30, 0x52, 0x0b, 0x9a, 0xcd, 0xc0, 0xe7, 0xdb, 0x67, 0xe1, + 0x0b, 0xb8, 0x71, 0x54, 0x66, 0xd2, 0xf4, 0xbc, 0xc1, 0x8c, 0x3b, 0x03, 0x54, 0xda, 0xa6, 0x09, + 0xc2, 0x89, 0x5e, 0x99, 0x92, 0xaf, 0xb4, 0x8f, 0xe4, 0xfb, 0x0d, 0x0b, 0x26, 0xf8, 0xb3, 0xc6, + 0xae, 0x5e, 0x64, 0x28, 0x06, 0x47, 0xfc, 0x5a, 0x5d, 0x8e, 0x0e, 0xe5, 0xec, 0xed, 0x82, 0xe3, + 0xee, 0x4e, 0xa2, 0x0b, 0x30, 0xb1, 0x11, 0x84, 0x35, 0x62, 0x0e, 0x84, 0x10, 0xdb, 0x8a, 0xd0, + 0xf9, 0x34, 0x02, 0xee, 0x7e, 0x06, 0x5d, 0x83, 0x07, 0x8c, 0x46, 0x73, 0x1c, 0xb8, 0xe4, 0x7e, + 0x54, 0x50, 0x7b, 0xe0, 0x7c, 0x26, 0x16, 0xee, 0xf1, 0x74, 0x52, 0x48, 0x56, 0xfa, 0x10, 0x92, + 0xaf, 0xc0, 0xa9, 0x5a, 0xf7, 0xc8, 0x6c, 0x47, 0xed, 0xf5, 0x88, 0xcb, 0xf1, 0xf2, 0xdc, 0xf7, + 0x08, 0x02, 0xa7, 0xe6, 0x7b, 0x21, 0xe2, 0xde, 0x34, 0xd0, 0xfb, 0xa0, 0x1c, 0x12, 0xf6, 0x55, + 0x22, 0x91, 0xae, 0x77, 0x48, 0x6f, 0x87, 0xb6, 0xe0, 0x39, 0x59, 0xad, 0x99, 0x44, 0x43, 0x84, + 0x15, 0x47, 0x74, 0x13, 0x86, 0x5a, 0x4e, 0x5c, 0xdb, 0x14, 0x49, 0x7a, 0x87, 0xf6, 0xcd, 0x2b, + 0xe6, 0xec, 0x28, 0xc5, 0x28, 0x79, 0xc0, 0x99, 0x60, 0xc9, 0x8d, 0xda, 0x6a, 0xb5, 0xa0, 0xd9, + 0x0a, 0x7c, 0xe2, 0xc7, 0x52, 0x89, 0x8c, 0xf1, 0xf3, 0x0e, 0xd9, 0x8a, 0x0d, 0x8c, 0x2e, 0x5d, + 0xae, 0xd1, 0x26, 0x27, 0xf6, 0xd0, 0xe5, 0x06, 0xb5, 0x5e, 0xcf, 0x53, 0x65, 0xc3, 0xdc, 0x8a, + 0xd7, 0xdd, 0x78, 0x33, 0x68, 0xc7, 0x72, 0x97, 0x2c, 0x14, 0x95, 0x52, 0x36, 0x4b, 0x19, 0x38, + 0x38, 0xf3, 0xc9, 0xb4, 0x66, 0x1d, 0xbf, 0x33, 0xcd, 0x7a, 0xac, 0x0f, 0xcd, 0x5a, 0x85, 0x93, + 0xac, 0x07, 0xc2, 0x4a, 0x96, 0x4e, 0xcb, 0x68, 0x12, 0xb1, 0xce, 0xab, 0xfc, 0x96, 0xa5, 0x2c, + 0x24, 0x9c, 0xfd, 0xec, 0xe9, 0x1f, 0x81, 0x89, 0x2e, 0x21, 0x77, 0x20, 0x87, 0xe4, 0x02, 0x3c, + 0x90, 0x2d, 0x4e, 0x0e, 0xe4, 0x96, 0xfc, 0xf5, 0x54, 0x5c, 0xba, 0xb1, 0x45, 0xeb, 0xc3, 0xc5, + 0xed, 0x40, 0x91, 0xf8, 0xdb, 0x42, 0xbb, 0x9e, 0x3f, 0xdc, 0xac, 0x3e, 0xe7, 0x6f, 0x73, 0x69, + 0xc8, 0xfc, 0x78, 0xe7, 0xfc, 0x6d, 0x4c, 0x69, 0xa3, 0x5f, 0xb0, 0x12, 0x1b, 0x08, 0xee, 0x18, + 0x7f, 0xcf, 0x91, 0xec, 0x49, 0xfb, 0xde, 0x53, 0xd8, 0xff, 0xae, 0x00, 0x67, 0xf6, 0x23, 0xd2, + 0xc7, 0xf0, 0x3d, 0x06, 0x83, 0x11, 0x8b, 0x34, 0x11, 0xea, 0x6a, 0x98, 0xae, 0x62, 0x1e, 0x7b, + 0xf2, 0x0a, 0x16, 0x20, 0xe4, 0x41, 0xb1, 0xe9, 0xb4, 0x84, 0xbf, 0x74, 0xf1, 0xb0, 0xf9, 0x7b, + 0xf4, 0xbf, 0xe3, 0x2d, 0x3b, 0x2d, 0x3e, 0xe7, 0x8d, 0x06, 0x4c, 0xd9, 0xa0, 0x18, 0x4a, 0x4e, + 0x18, 0x3a, 0x32, 0xac, 0xe1, 0x72, 0x3e, 0xfc, 0x66, 0x29, 0x49, 0x7e, 0x2a, 0x9c, 0x68, 0xc2, + 0x9c, 0x99, 0xfd, 0xe9, 0x72, 0x22, 0xd9, 0x8b, 0xc5, 0xaa, 0x44, 0x30, 0x28, 0xdc, 0xa4, 0x56, + 0xde, 0x69, 0x93, 0x3c, 0x9b, 0x9a, 0x79, 0x20, 0x44, 0x4d, 0x0a, 0xc1, 0x0a, 0x7d, 0xcc, 0x62, + 0x95, 0x1f, 0x64, 0x06, 0x9d, 0xd8, 0xd5, 0x1f, 0x4d, 0x21, 0x0a, 0xb3, 0x9e, 0x84, 0x6c, 0xc4, + 0x26, 0x77, 0x51, 0xdd, 0x86, 0xed, 0x66, 0xba, 0xab, 0xdb, 0xb0, 0xdd, 0x89, 0x84, 0xa3, 0x9d, + 0x8c, 0x98, 0x94, 0x1c, 0xaa, 0x07, 0xf4, 0x11, 0x85, 0xf2, 0x79, 0x0b, 0x26, 0xdc, 0x74, 0x70, + 0x81, 0xd8, 0x03, 0x5f, 0xcf, 0xc7, 0xa7, 0xd9, 0x1d, 0xbb, 0xa0, 0x0c, 0x9d, 0x2e, 0x10, 0xee, + 0xee, 0x0c, 0xaa, 0xc3, 0x80, 0xeb, 0x6f, 0x04, 0xc2, 0xbc, 0x9b, 0x3b, 0x5c, 0xa7, 0x16, 0xfd, + 0x8d, 0x40, 0xaf, 0x66, 0xfa, 0x0f, 0x33, 0xea, 0x68, 0x09, 0x4e, 0xc8, 0x7c, 0x9f, 0x8b, 0x6e, + 0x14, 0x07, 0x61, 0x67, 0xc9, 0x6d, 0xba, 0x31, 0x33, 0xcd, 0x8a, 0x73, 0x93, 0x54, 0xbd, 0xe1, + 0x0c, 0x38, 0xce, 0x7c, 0x0a, 0xbd, 0x06, 0x43, 0xf2, 0x40, 0xbf, 0x9c, 0x87, 0x3f, 0xa1, 0x7b, + 0xfe, 0xab, 0xc9, 0x54, 0x15, 0x27, 0xfa, 0x92, 0x21, 0xfa, 0xa8, 0x05, 0x63, 0xfc, 0xf7, 0xc5, + 0x4e, 0x9d, 0xa7, 0x18, 0x56, 0xf2, 0x88, 0xda, 0xaf, 0x26, 0x68, 0xce, 0xa1, 0x5b, 0xbb, 0x53, + 0x63, 0xc9, 0x36, 0x9c, 0xe2, 0x6b, 0xff, 0xe3, 0x11, 0xe8, 0x0e, 0x81, 0x48, 0xc6, 0x3b, 0x58, + 0x77, 0x3b, 0xde, 0x81, 0xee, 0x2a, 0x23, 0x1d, 0xaa, 0x90, 0xc3, 0x32, 0x13, 0x5c, 0xf5, 0x31, + 0x74, 0xc7, 0xaf, 0x61, 0xc6, 0x03, 0xb5, 0x61, 0x90, 0x17, 0x97, 0x12, 0x1a, 0xe0, 0xf0, 0x27, + 0xdf, 0x66, 0x91, 0x2a, 0xed, 0xd6, 0xe2, 0xad, 0x58, 0x30, 0x43, 0x3b, 0x30, 0xb4, 0xc9, 0xa7, + 0xa3, 0xd8, 0xeb, 0x2d, 0x1f, 0x76, 0x7c, 0x13, 0x73, 0x5c, 0x4f, 0x3e, 0xd1, 0x80, 0x25, 0x3b, + 0x16, 0x5e, 0x67, 0x04, 0x00, 0x71, 0x41, 0x92, 0x5f, 0xb6, 0x64, 0xff, 0xd1, 0x3f, 0xef, 0x85, + 0x91, 0x90, 0xd4, 0x02, 0xbf, 0xe6, 0x7a, 0xa4, 0x3e, 0x2b, 0x0f, 0xc4, 0x0e, 0x92, 0x24, 0xc7, + 0xbc, 0x49, 0xd8, 0xa0, 0x81, 0x13, 0x14, 0xd9, 0x3a, 0x53, 0x89, 0xf3, 0xf4, 0x83, 0x10, 0x71, + 0xf0, 0xb1, 0x94, 0x53, 0x9a, 0x3e, 0xa3, 0xc9, 0xd7, 0x59, 0xb2, 0x0d, 0xa7, 0xf8, 0xa2, 0x97, + 0x00, 0x82, 0x75, 0x1e, 0x43, 0x37, 0x1b, 0x8b, 0x53, 0x90, 0x83, 0xbc, 0xea, 0x18, 0x4f, 0xb6, + 0x95, 0x14, 0xb0, 0x41, 0x0d, 0x5d, 0x06, 0xe0, 0x2b, 0x67, 0xad, 0xd3, 0x92, 0x1b, 0x42, 0x99, + 0xe5, 0x08, 0x55, 0x05, 0xb9, 0xbd, 0x3b, 0xd5, 0xed, 0x73, 0x66, 0x81, 0x42, 0xc6, 0xe3, 0xe8, + 0x27, 0x60, 0x28, 0x6a, 0x37, 0x9b, 0x8e, 0x3a, 0x23, 0xc9, 0x31, 0x7d, 0x97, 0xd3, 0x35, 0x04, + 0x23, 0x6f, 0xc0, 0x92, 0x23, 0xba, 0x41, 0x45, 0xbc, 0x90, 0x50, 0x7c, 0x15, 0x71, 0x0b, 0x85, + 0x7b, 0x02, 0xdf, 0x21, 0x77, 0x31, 0x38, 0x03, 0xe7, 0xf6, 0xee, 0xd4, 0x03, 0xc9, 0xf6, 0xa5, + 0x40, 0x24, 0xd4, 0x66, 0xd2, 0x44, 0x97, 0x64, 0x1d, 0x2d, 0xfa, 0xda, 0xb2, 0xbc, 0xcb, 0x13, + 0xba, 0x8e, 0x16, 0x6b, 0xee, 0x3d, 0x66, 0xe6, 0xc3, 0x68, 0x19, 0x8e, 0xd7, 0x02, 0x3f, 0x0e, + 0x03, 0xcf, 0xe3, 0x35, 0xf6, 0xf8, 0xde, 0x9c, 0x9f, 0xa1, 0x3c, 0x24, 0xba, 0x7d, 0x7c, 0xbe, + 0x1b, 0x05, 0x67, 0x3d, 0x47, 0x6d, 0xf2, 0xb4, 0x7e, 0x18, 0xcb, 0xe5, 0x78, 0x3d, 0x41, 0x53, + 0x48, 0x28, 0xe5, 0xf6, 0xde, 0x47, 0x53, 0xf8, 0xc9, 0x43, 0x56, 0xf1, 0xc5, 0x9e, 0x85, 0x11, + 0xb2, 0x13, 0x93, 0xd0, 0x77, 0xbc, 0xab, 0x78, 0x49, 0x1e, 0x58, 0xb0, 0x85, 0x79, 0xce, 0x68, + 0xc7, 0x09, 0x2c, 0x64, 0x2b, 0x2f, 0x99, 0x91, 0xb9, 0xce, 0xbd, 0x64, 0xd2, 0x27, 0x66, 0x7f, + 0xb1, 0x98, 0xb0, 0x59, 0xef, 0xc9, 0x91, 0x2e, 0x2b, 0x91, 0x24, 0x6b, 0x49, 0x31, 0x80, 0xd8, + 0x8b, 0xe5, 0xc9, 0x59, 0x95, 0x48, 0x5a, 0x31, 0x19, 0xe1, 0x24, 0x5f, 0xb4, 0x05, 0xa5, 0xcd, + 0x20, 0x8a, 0xe5, 0x0e, 0xed, 0x90, 0x9b, 0xc1, 0x8b, 0x41, 0x14, 0x33, 0x43, 0x4b, 0xbd, 0x36, + 0x6d, 0x89, 0x30, 0xe7, 0x41, 0xf7, 0xfe, 0xd1, 0xa6, 0x13, 0xd6, 0xa3, 0x79, 0x56, 0x67, 0x62, + 0x80, 0x59, 0x58, 0xca, 0x9e, 0xae, 0x6a, 0x10, 0x36, 0xf1, 0xec, 0x6f, 0x5b, 0x89, 0x53, 0xad, + 0xeb, 0x2c, 0x69, 0x60, 0x9b, 0xf8, 0x54, 0x44, 0x99, 0x61, 0x8a, 0x3f, 0x90, 0x4a, 0xc1, 0x7e, + 0x5b, 0xaf, 0x72, 0x98, 0x37, 0x29, 0x85, 0x69, 0x46, 0xc2, 0x88, 0x68, 0xfc, 0x80, 0x95, 0xcc, + 0xa5, 0x2f, 0xe4, 0xb1, 0x75, 0x33, 0xeb, 0x49, 0xec, 0x9b, 0x96, 0x6f, 0xff, 0x82, 0x05, 0x43, + 0x73, 0x4e, 0x6d, 0x2b, 0xd8, 0xd8, 0x40, 0x4f, 0x42, 0xb9, 0xde, 0x0e, 0xcd, 0xb4, 0x7e, 0xe5, + 0xac, 0x5a, 0x10, 0xed, 0x58, 0x61, 0xd0, 0xa9, 0xbf, 0xe1, 0xd4, 0x64, 0x55, 0x89, 0x22, 0x9f, + 0xfa, 0xe7, 0x59, 0x0b, 0x16, 0x10, 0x3a, 0xfc, 0x4d, 0x67, 0x47, 0x3e, 0x9c, 0x3e, 0x52, 0x5b, + 0xd6, 0x20, 0x6c, 0xe2, 0xd9, 0xff, 0xda, 0x82, 0xc9, 0x39, 0x27, 0x72, 0x6b, 0xb3, 0xed, 0x78, + 0x73, 0xce, 0x8d, 0xd7, 0xdb, 0xb5, 0x2d, 0x12, 0xf3, 0xea, 0x23, 0xb4, 0x97, 0xed, 0x88, 0xae, + 0x40, 0xb5, 0x63, 0x56, 0xbd, 0xbc, 0x2a, 0xda, 0xb1, 0xc2, 0x40, 0xaf, 0xc1, 0x70, 0xcb, 0x89, + 0xa2, 0x9b, 0x41, 0x58, 0xc7, 0x64, 0x23, 0x9f, 0xfa, 0x44, 0x55, 0x52, 0x0b, 0x49, 0x8c, 0xc9, + 0x86, 0x08, 0x50, 0xd1, 0xf4, 0xb1, 0xc9, 0xcc, 0xfe, 0x39, 0x0b, 0x4e, 0xcc, 0x11, 0x27, 0x24, + 0x21, 0x2b, 0x67, 0xa4, 0x5e, 0x04, 0xbd, 0x0a, 0xe5, 0x98, 0xb6, 0xd0, 0x1e, 0x59, 0xf9, 0xf6, + 0x88, 0x85, 0x96, 0xac, 0x09, 0xe2, 0x58, 0xb1, 0xb1, 0x3f, 0x69, 0xc1, 0xa9, 0xac, 0xbe, 0xcc, + 0x7b, 0x41, 0xbb, 0x7e, 0x2f, 0x3a, 0xf4, 0x77, 0x2c, 0x18, 0x61, 0xc7, 0xf5, 0x0b, 0x24, 0x76, + 0x5c, 0xaf, 0xab, 0x94, 0xa2, 0xd5, 0x67, 0x29, 0xc5, 0x33, 0x30, 0xb0, 0x19, 0x34, 0x49, 0x3a, + 0xd4, 0xe4, 0x62, 0xd0, 0x24, 0x98, 0x41, 0xd0, 0xd3, 0x74, 0x12, 0xba, 0x7e, 0xec, 0xd0, 0xe5, + 0x28, 0x8f, 0x33, 0xc6, 0xf9, 0x04, 0x54, 0xcd, 0xd8, 0xc4, 0xb1, 0x7f, 0xa7, 0x02, 0x43, 0x22, + 0x2e, 0xaa, 0xef, 0x6a, 0x38, 0xd2, 0x8b, 0x53, 0xe8, 0xe9, 0xc5, 0x89, 0x60, 0xb0, 0xc6, 0xea, + 0xdd, 0x0a, 0x0b, 0xfd, 0x72, 0x2e, 0x81, 0x74, 0xbc, 0x84, 0xae, 0xee, 0x16, 0xff, 0x8f, 0x05, + 0x2b, 0xf4, 0xba, 0x05, 0xe3, 0xb5, 0xc0, 0xf7, 0x49, 0x4d, 0xdb, 0x8e, 0x03, 0x79, 0x6c, 0x10, + 0xe6, 0x93, 0x44, 0xf5, 0x49, 0x70, 0x0a, 0x80, 0xd3, 0xec, 0xd1, 0x0b, 0x30, 0xca, 0xc7, 0xec, + 0x5a, 0xe2, 0x0c, 0x46, 0x57, 0xd8, 0x33, 0x81, 0x38, 0x89, 0x8b, 0xa6, 0xf9, 0x59, 0x96, 0xa8, + 0x65, 0x37, 0xa8, 0x5d, 0xd5, 0x46, 0x15, 0x3b, 0x03, 0x03, 0x85, 0x80, 0x42, 0xb2, 0x11, 0x92, + 0x68, 0x53, 0xc4, 0x8d, 0x31, 0xbb, 0x75, 0xe8, 0xce, 0xea, 0x58, 0xe0, 0x2e, 0x4a, 0x38, 0x83, + 0x3a, 0xda, 0x12, 0x6e, 0x84, 0x72, 0x1e, 0xf2, 0x5c, 0x7c, 0xe6, 0x9e, 0xde, 0x84, 0x29, 0x28, + 0x31, 0xd5, 0xc5, 0xec, 0xe5, 0x22, 0xcf, 0x9d, 0x64, 0x8a, 0x0d, 0xf3, 0x76, 0xb4, 0x00, 0xc7, + 0x52, 0xf5, 0x01, 0x23, 0x71, 0x56, 0xa2, 0xf2, 0xe4, 0x52, 0x95, 0x05, 0x23, 0xdc, 0xf5, 0x84, + 0xe9, 0x62, 0x1a, 0xde, 0xc7, 0xc5, 0xd4, 0x51, 0xd1, 0xc9, 0xfc, 0x14, 0xe3, 0xc5, 0x5c, 0x06, + 0xa0, 0xaf, 0x50, 0xe4, 0x4f, 0xa4, 0x42, 0x91, 0x47, 0x59, 0x07, 0xae, 0xe5, 0xd3, 0x81, 0x83, + 0xc7, 0x1d, 0xdf, 0xcb, 0x38, 0xe2, 0xff, 0x65, 0x81, 0xfc, 0xae, 0xf3, 0x4e, 0x6d, 0x93, 0xd0, + 0x29, 0x83, 0xde, 0x09, 0x63, 0xca, 0x3b, 0xc1, 0x4d, 0x22, 0x8b, 0xcd, 0x1a, 0x65, 0x3b, 0xe3, + 0x04, 0x14, 0xa7, 0xb0, 0xd1, 0x0c, 0x54, 0xe8, 0x38, 0xf1, 0x47, 0xb9, 0xde, 0x57, 0x1e, 0x90, + 0xd9, 0xd5, 0x45, 0xf1, 0x94, 0xc6, 0x41, 0x01, 0x4c, 0x78, 0x4e, 0x14, 0xb3, 0x1e, 0x54, 0x3b, + 0x7e, 0xed, 0x0e, 0xab, 0xc8, 0xb0, 0x64, 0xac, 0xa5, 0x34, 0x21, 0xdc, 0x4d, 0xdb, 0xfe, 0xf7, + 0x25, 0x18, 0x4d, 0x48, 0xc6, 0x03, 0x1a, 0x0c, 0x4f, 0x42, 0x59, 0xea, 0xf0, 0x74, 0xb9, 0x2c, + 0xa5, 0xe8, 0x15, 0x06, 0x55, 0x5a, 0xeb, 0x5a, 0xab, 0xa6, 0x0d, 0x1c, 0x43, 0xe1, 0x62, 0x13, + 0x8f, 0x09, 0xe5, 0xd8, 0x8b, 0xe6, 0x3d, 0x97, 0xf8, 0x31, 0xef, 0x66, 0x3e, 0x42, 0x79, 0x6d, + 0xa9, 0x6a, 0x12, 0xd5, 0x42, 0x39, 0x05, 0xc0, 0x69, 0xf6, 0xe8, 0xc3, 0x16, 0x8c, 0x3a, 0x37, + 0x23, 0x5d, 0x94, 0x5d, 0x04, 0x1d, 0x1f, 0x52, 0x49, 0x25, 0xea, 0xbc, 0x73, 0xc7, 0x7e, 0xa2, + 0x09, 0x27, 0x99, 0xa2, 0x37, 0x2c, 0x40, 0x64, 0x87, 0xd4, 0x64, 0x58, 0xb4, 0xe8, 0xcb, 0x60, + 0x1e, 0x3b, 0xf8, 0x73, 0x5d, 0x74, 0xb9, 0x54, 0xef, 0x6e, 0xc7, 0x19, 0x7d, 0x40, 0x97, 0x00, + 0xd5, 0xdd, 0xc8, 0x59, 0xf7, 0xc8, 0x7c, 0xd0, 0x94, 0x09, 0xc4, 0xe2, 0x3c, 0xfd, 0xb4, 0x18, + 0x67, 0xb4, 0xd0, 0x85, 0x81, 0x33, 0x9e, 0x62, 0xb3, 0x2c, 0x0c, 0x76, 0x3a, 0x57, 0x43, 0x8f, + 0x69, 0x09, 0x73, 0x96, 0x89, 0x76, 0xac, 0x30, 0xec, 0x3f, 0x2f, 0xaa, 0xa5, 0xac, 0x73, 0x00, + 0x1c, 0x23, 0x16, 0xd9, 0xba, 0xf3, 0x58, 0x64, 0x1d, 0x29, 0xd5, 0x9d, 0x16, 0x9f, 0xc8, 0xa2, + 0x2d, 0xdc, 0xa3, 0x2c, 0xda, 0x9f, 0xb6, 0x12, 0x25, 0xe9, 0x86, 0xcf, 0xbe, 0x94, 0x6f, 0xfe, + 0xc1, 0x34, 0x8f, 0xe2, 0x4a, 0xe9, 0x95, 0x54, 0xf0, 0xde, 0x93, 0x50, 0xde, 0xf0, 0x1c, 0x56, + 0x48, 0x85, 0x2d, 0x54, 0x23, 0xc2, 0xec, 0xbc, 0x68, 0xc7, 0x0a, 0x83, 0x4a, 0x7d, 0x83, 0xe8, + 0x81, 0xa4, 0xf6, 0x7f, 0x2a, 0xc2, 0xb0, 0xa1, 0xf1, 0x33, 0xcd, 0x37, 0xeb, 0x3e, 0x33, 0xdf, + 0x0a, 0x07, 0x30, 0xdf, 0x7e, 0x0a, 0x2a, 0x35, 0xa9, 0x8d, 0xf2, 0x29, 0xb1, 0x9f, 0xd6, 0x71, + 0x5a, 0x21, 0xa9, 0x26, 0xac, 0x79, 0xa2, 0x0b, 0x89, 0x4c, 0xcd, 0x84, 0x5f, 0x20, 0x2b, 0x95, + 0x52, 0x68, 0xb4, 0xee, 0x67, 0xd2, 0xf1, 0x01, 0xa5, 0xfd, 0xe3, 0x03, 0xec, 0xaf, 0x5b, 0xea, + 0xe3, 0xde, 0x85, 0x92, 0x3c, 0x37, 0x92, 0x25, 0x79, 0xce, 0xe5, 0x32, 0xcc, 0x3d, 0x6a, 0xf1, + 0x5c, 0x81, 0xa1, 0xf9, 0xa0, 0xd9, 0x74, 0xfc, 0x3a, 0xfa, 0x5e, 0x18, 0xaa, 0xf1, 0x9f, 0xc2, + 0x87, 0xc6, 0x0e, 0xab, 0x05, 0x14, 0x4b, 0x18, 0x7a, 0x18, 0x06, 0x9c, 0xb0, 0x21, 0xfd, 0x66, + 0x2c, 0x08, 0x6e, 0x36, 0x6c, 0x44, 0x98, 0xb5, 0xda, 0x7f, 0x69, 0xc1, 0x18, 0x7d, 0xc4, 0x65, + 0x2f, 0xc5, 0x5e, 0xe7, 0x71, 0x18, 0x74, 0xda, 0xf1, 0x66, 0xd0, 0xb5, 0x0f, 0x9b, 0x65, 0xad, + 0x58, 0x40, 0xe9, 0x3e, 0x4c, 0xd5, 0x72, 0x30, 0xf6, 0x61, 0x0b, 0x74, 0x2e, 0x33, 0x08, 0x35, + 0x65, 0xa3, 0xf6, 0x7a, 0xd6, 0x69, 0x69, 0x95, 0x37, 0x63, 0x09, 0xa7, 0xc4, 0xd6, 0x83, 0x7a, + 0x47, 0x84, 0xf6, 0x2a, 0x62, 0x73, 0x41, 0xbd, 0x83, 0x19, 0x04, 0x3d, 0x02, 0xc5, 0x68, 0xd3, + 0x91, 0xe7, 0xf2, 0x32, 0xca, 0xbc, 0x7a, 0x71, 0x16, 0xd3, 0x76, 0x95, 0x34, 0x11, 0x7a, 0xe9, + 0x18, 0xdb, 0x64, 0xd2, 0x44, 0xe8, 0xd9, 0xff, 0x62, 0x00, 0x58, 0xbc, 0x8d, 0x13, 0x92, 0xfa, + 0x5a, 0xc0, 0xaa, 0x01, 0x1f, 0xe9, 0xb1, 0xb6, 0xde, 0xc8, 0xde, 0xcf, 0x47, 0xdb, 0xc6, 0xf1, + 0x66, 0xf1, 0x6e, 0x1f, 0x6f, 0x66, 0x9f, 0x58, 0x0f, 0xdc, 0x47, 0x27, 0xd6, 0xf6, 0xc7, 0x2d, + 0x40, 0x2a, 0x7a, 0x4a, 0x87, 0x94, 0xcc, 0x40, 0x45, 0x85, 0x6b, 0x89, 0xf5, 0xa2, 0xc5, 0xa2, + 0x04, 0x60, 0x8d, 0xd3, 0x87, 0xf7, 0xe2, 0x31, 0xa9, 0xb3, 0x8a, 0xc9, 0x9c, 0x0b, 0xa6, 0xe9, + 0x84, 0x0a, 0xb3, 0x7f, 0xb7, 0x00, 0x0f, 0x70, 0x73, 0x69, 0xd9, 0xf1, 0x9d, 0x06, 0x69, 0xd2, + 0x5e, 0xf5, 0x1b, 0x24, 0x54, 0xa3, 0xdb, 0x66, 0x57, 0x66, 0x48, 0x1c, 0x56, 0x5e, 0x71, 0x39, + 0xc3, 0x25, 0xcb, 0xa2, 0xef, 0xc6, 0x98, 0x11, 0x47, 0x11, 0x94, 0xe5, 0x7d, 0x44, 0x42, 0xff, + 0xe4, 0xc4, 0x48, 0x89, 0x62, 0x61, 0x59, 0x10, 0xac, 0x18, 0x51, 0xf3, 0xc1, 0x0b, 0x6a, 0x5b, + 0x74, 0xc9, 0xa7, 0xcd, 0x87, 0x25, 0xd1, 0x8e, 0x15, 0x86, 0xdd, 0x84, 0x71, 0x39, 0x86, 0xad, + 0xcb, 0xa4, 0x83, 0xc9, 0x06, 0xd5, 0xb9, 0x35, 0xd9, 0x64, 0x5c, 0x91, 0xa4, 0x74, 0xee, 0xbc, + 0x09, 0xc4, 0x49, 0x5c, 0x59, 0x20, 0xb8, 0x90, 0x5d, 0x20, 0xd8, 0xfe, 0x5d, 0x0b, 0xd2, 0x4a, + 0xdf, 0x28, 0x87, 0x6a, 0xed, 0x59, 0x0e, 0xf5, 0x00, 0x05, 0x45, 0x7f, 0x1c, 0x86, 0x9d, 0x98, + 0x5a, 0x75, 0xdc, 0x03, 0x53, 0xbc, 0xb3, 0x93, 0xc3, 0xe5, 0xa0, 0xee, 0x6e, 0xb8, 0xcc, 0xf3, + 0x62, 0x92, 0xb3, 0xdf, 0xb0, 0xa0, 0xb2, 0x10, 0x76, 0x0e, 0x9e, 0xaa, 0xd6, 0x9d, 0x88, 0x56, + 0x38, 0x50, 0x22, 0x9a, 0x4c, 0x75, 0x2b, 0xf6, 0x4a, 0x75, 0xb3, 0xff, 0x6a, 0x00, 0x26, 0xba, + 0x72, 0x2f, 0xd1, 0xf3, 0x30, 0xa2, 0xbe, 0x92, 0x74, 0xbb, 0x56, 0xcc, 0xe0, 0x65, 0x0d, 0xc3, + 0x09, 0xcc, 0x3e, 0x96, 0xea, 0x22, 0x1c, 0x0f, 0xc9, 0xab, 0x6d, 0xd2, 0x26, 0xb3, 0x1b, 0x31, + 0x09, 0xab, 0xa4, 0x16, 0xf8, 0x75, 0x5e, 0x4f, 0xb8, 0x38, 0xf7, 0xe0, 0xad, 0xdd, 0xa9, 0xe3, + 0xb8, 0x1b, 0x8c, 0xb3, 0x9e, 0x41, 0x2d, 0x18, 0xf5, 0xcc, 0xfd, 0x82, 0xd8, 0xa6, 0xde, 0xd1, + 0x56, 0x43, 0xcd, 0xd6, 0x44, 0x33, 0x4e, 0x32, 0x48, 0x6e, 0x3a, 0x4a, 0xf7, 0x68, 0xd3, 0xf1, + 0x21, 0xbd, 0xe9, 0xe0, 0xb1, 0x40, 0xef, 0xce, 0x39, 0xf7, 0xb6, 0x9f, 0x5d, 0xc7, 0x61, 0xf6, + 0x11, 0x2f, 0x42, 0x59, 0xc6, 0x49, 0xf6, 0x15, 0x5f, 0x68, 0xd2, 0xe9, 0x21, 0xdb, 0x1f, 0x87, + 0xb7, 0x9e, 0x0b, 0x43, 0x63, 0x30, 0xaf, 0x04, 0xf1, 0xac, 0xe7, 0x05, 0x37, 0xa9, 0xb9, 0x72, + 0x35, 0x22, 0xc2, 0x0f, 0x68, 0xdf, 0x2e, 0x40, 0xc6, 0x96, 0x9a, 0xae, 0x49, 0x6d, 0x17, 0x26, + 0xd6, 0xe4, 0xc1, 0x6c, 0x43, 0xb4, 0xc3, 0x63, 0x49, 0xb9, 0x35, 0xf0, 0xae, 0xbc, 0x5d, 0x02, + 0x3a, 0xbc, 0x54, 0x49, 0x4a, 0x15, 0x62, 0x7a, 0x16, 0x40, 0x9b, 0xf3, 0xc2, 0x26, 0x54, 0xc1, + 0x21, 0xda, 0xea, 0xc7, 0x06, 0x16, 0x7a, 0x0e, 0x86, 0x5d, 0x3f, 0x8a, 0x1d, 0xcf, 0xbb, 0xe8, + 0xfa, 0xb1, 0xb0, 0x13, 0x95, 0xd9, 0xb3, 0xa8, 0x41, 0xd8, 0xc4, 0x3b, 0xfd, 0x0e, 0xe3, 0xfb, + 0x1d, 0xe4, 0xbb, 0x6f, 0xc2, 0xa9, 0x0b, 0x6e, 0xac, 0x92, 0x14, 0xd5, 0x7c, 0xa3, 0xd6, 0xba, + 0x92, 0x55, 0x56, 0xcf, 0xb4, 0x5c, 0x23, 0x49, 0xb0, 0x90, 0xcc, 0x69, 0x4c, 0x27, 0x09, 0xda, + 0x35, 0x38, 0x71, 0xc1, 0x8d, 0xcf, 0xbb, 0x1e, 0x39, 0x42, 0x26, 0x5f, 0x1a, 0x84, 0x11, 0x33, + 0x77, 0xff, 0x20, 0x92, 0xfd, 0x93, 0xd4, 0x8e, 0x15, 0x03, 0xe1, 0xaa, 0x03, 0xef, 0xeb, 0x87, + 0x2e, 0x24, 0x90, 0x3d, 0xb8, 0x86, 0x29, 0xab, 0x79, 0x62, 0xb3, 0x03, 0xe8, 0x26, 0x94, 0x36, + 0x58, 0xbe, 0x5b, 0x31, 0x8f, 0x50, 0xa5, 0xac, 0xc1, 0xd7, 0x2b, 0x97, 0x67, 0xcc, 0x71, 0x7e, + 0xd4, 0xfc, 0x08, 0x93, 0x69, 0xd6, 0x46, 0x16, 0x82, 0xd0, 0x6b, 0x0a, 0xa3, 0x97, 0xf6, 0x28, + 0xdd, 0x81, 0xf6, 0x48, 0xc8, 0xf2, 0xc1, 0x7b, 0x24, 0xcb, 0x59, 0xee, 0x62, 0xbc, 0xc9, 0x8c, + 0x63, 0x91, 0x36, 0x35, 0xc4, 0x06, 0xc1, 0xc8, 0x5d, 0x4c, 0x80, 0x71, 0x1a, 0x1f, 0xbd, 0x5f, + 0x69, 0x83, 0x72, 0x1e, 0x07, 0x0a, 0xe6, 0x8c, 0x3e, 0x6a, 0x45, 0xf0, 0xf1, 0x02, 0x8c, 0x5d, + 0xf0, 0xdb, 0xab, 0x17, 0x56, 0xdb, 0xeb, 0x9e, 0x5b, 0xbb, 0x4c, 0x3a, 0x54, 0xda, 0x6f, 0x91, + 0xce, 0xe2, 0x82, 0x58, 0x41, 0x6a, 0xce, 0x5c, 0xa6, 0x8d, 0x98, 0xc3, 0xa8, 0xdc, 0xda, 0x70, + 0xfd, 0x06, 0x09, 0x5b, 0xa1, 0x2b, 0x7c, 0xfd, 0x86, 0xdc, 0x3a, 0xaf, 0x41, 0xd8, 0xc4, 0xa3, + 0xb4, 0x83, 0x9b, 0x3e, 0x09, 0xd3, 0xbb, 0x84, 0x15, 0xda, 0x88, 0x39, 0x8c, 0x22, 0xc5, 0x61, + 0x5b, 0xb8, 0xd2, 0x0c, 0xa4, 0x35, 0xda, 0x88, 0x39, 0x4c, 0xec, 0xd2, 0x59, 0x24, 0x58, 0xa9, + 0x6b, 0x97, 0xce, 0x82, 0x28, 0x24, 0x9c, 0xa2, 0x6e, 0x91, 0xce, 0x82, 0x13, 0x3b, 0xe9, 0x4d, + 0xf6, 0x65, 0xde, 0x8c, 0x25, 0x9c, 0x15, 0x47, 0x4e, 0x0e, 0xc7, 0x77, 0x5c, 0x71, 0xe4, 0x64, + 0xf7, 0x7b, 0x38, 0x64, 0xfe, 0x76, 0x01, 0x46, 0xde, 0xbc, 0xc1, 0x34, 0xe3, 0x6e, 0x9e, 0xeb, + 0x30, 0xd1, 0x95, 0x31, 0xdd, 0x87, 0x85, 0xb4, 0x6f, 0x45, 0x0b, 0x1b, 0xc3, 0x30, 0x25, 0x2c, + 0x8b, 0x02, 0xce, 0xc3, 0x04, 0x5f, 0xbc, 0x94, 0x13, 0x4b, 0x80, 0x55, 0x59, 0xf0, 0xec, 0x30, + 0xeb, 0x5a, 0x1a, 0x88, 0xbb, 0xf1, 0xed, 0x4f, 0x58, 0x30, 0x9a, 0x48, 0x62, 0xcf, 0xc9, 0x96, + 0x63, 0xab, 0x3b, 0x60, 0x51, 0xcc, 0x2c, 0xab, 0xa4, 0xc8, 0xd4, 0xb0, 0x5e, 0xdd, 0x1a, 0x84, + 0x4d, 0x3c, 0xfb, 0xf7, 0x8b, 0x50, 0x96, 0x11, 0x57, 0x7d, 0x74, 0xe5, 0x63, 0x16, 0x8c, 0xaa, + 0x03, 0x44, 0xe6, 0xf1, 0x2d, 0xe4, 0x91, 0x53, 0x47, 0x7b, 0xa0, 0xfc, 0x27, 0xfe, 0x46, 0xa0, + 0x37, 0x16, 0xd8, 0x64, 0x86, 0x93, 0xbc, 0xd1, 0x35, 0x80, 0xa8, 0x13, 0xc5, 0xa4, 0x69, 0xf8, + 0x9e, 0x6d, 0x63, 0x96, 0x4d, 0xd7, 0x82, 0x90, 0xd0, 0x39, 0x75, 0x25, 0xa8, 0x93, 0xaa, 0xc2, + 0xd4, 0x16, 0x9e, 0x6e, 0xc3, 0x06, 0x25, 0xf4, 0x9a, 0x3a, 0xee, 0x1e, 0xc8, 0x43, 0xaf, 0xcb, + 0xf1, 0xed, 0xe7, 0xbc, 0xfb, 0x10, 0xe7, 0xcb, 0xf6, 0xaf, 0x15, 0xe0, 0x58, 0x7a, 0x24, 0xd1, + 0xbb, 0x61, 0x44, 0x0e, 0x9a, 0xe1, 0x66, 0x90, 0x61, 0x6e, 0x23, 0xd8, 0x80, 0xdd, 0xde, 0x9d, + 0x9a, 0xea, 0xbe, 0x0a, 0x7b, 0xda, 0x44, 0xc1, 0x09, 0x62, 0xfc, 0xf0, 0x59, 0x44, 0x49, 0xcc, + 0x75, 0x66, 0x5b, 0x2d, 0x71, 0x82, 0x6c, 0x1c, 0x3e, 0x9b, 0x50, 0x9c, 0xc2, 0x46, 0xab, 0x70, + 0xc2, 0x68, 0xb9, 0x42, 0xdc, 0xc6, 0xe6, 0x7a, 0x10, 0xca, 0x7d, 0xed, 0xc3, 0x3a, 0xa8, 0xb6, + 0x1b, 0x07, 0x67, 0x3e, 0x49, 0x0d, 0xa3, 0x9a, 0xd3, 0x72, 0x6a, 0x6e, 0xdc, 0x11, 0x67, 0x00, + 0x4a, 0x8c, 0xcf, 0x8b, 0x76, 0xac, 0x30, 0xec, 0x7f, 0x30, 0x00, 0xc7, 0x78, 0x14, 0x29, 0x51, + 0x41, 0xd2, 0xe8, 0xdd, 0x50, 0x89, 0x62, 0x27, 0xe4, 0x4e, 0x0d, 0xeb, 0xc0, 0xa2, 0x4b, 0x67, + 0xde, 0x4b, 0x22, 0x58, 0xd3, 0x43, 0x2f, 0xb1, 0xb2, 0x65, 0x6e, 0xb4, 0xc9, 0xa8, 0x17, 0xee, + 0xcc, 0x65, 0x72, 0x5e, 0x51, 0xc0, 0x06, 0x35, 0xf4, 0x43, 0x50, 0x6a, 0x6d, 0x3a, 0x91, 0xf4, + 0xe7, 0x3d, 0x2e, 0xe5, 0xc4, 0x2a, 0x6d, 0xbc, 0xbd, 0x3b, 0x75, 0x32, 0xfd, 0xaa, 0x0c, 0x80, + 0xf9, 0x43, 0xa6, 0x94, 0x1f, 0xd8, 0xff, 0x6a, 0x9d, 0x7a, 0xd8, 0xa9, 0x5e, 0x9c, 0x4d, 0x5f, + 0xc6, 0xb2, 0xc0, 0x5a, 0xb1, 0x80, 0x52, 0x99, 0xb4, 0xc9, 0x59, 0xd6, 0x29, 0xf2, 0x60, 0xd2, + 0xe2, 0xb8, 0xa8, 0x41, 0xd8, 0xc4, 0x43, 0x1f, 0xef, 0x8e, 0x31, 0x1e, 0x3a, 0x82, 0x1c, 0x94, + 0x7e, 0xa3, 0x8b, 0xcf, 0x41, 0x45, 0x74, 0x75, 0x2d, 0x40, 0xcf, 0xc3, 0x08, 0x77, 0x17, 0xcd, + 0x85, 0x8e, 0x5f, 0xdb, 0x4c, 0x3b, 0x79, 0xd6, 0x0c, 0x18, 0x4e, 0x60, 0xda, 0xcb, 0x30, 0xd0, + 0xa7, 0x90, 0xed, 0x6b, 0xef, 0xfe, 0x22, 0x94, 0x29, 0x39, 0xb9, 0x41, 0xcb, 0x83, 0x64, 0x00, + 0x65, 0x79, 0x51, 0x23, 0xb2, 0xa1, 0xe8, 0x3a, 0x32, 0x96, 0x44, 0x2d, 0xa1, 0xc5, 0x28, 0x6a, + 0xb3, 0x69, 0x47, 0x81, 0xe8, 0x31, 0x28, 0x92, 0x9d, 0x56, 0x3a, 0x68, 0xe4, 0xdc, 0x4e, 0xcb, + 0x0d, 0x49, 0x44, 0x91, 0xc8, 0x4e, 0x0b, 0x9d, 0x86, 0x82, 0x5b, 0x17, 0x33, 0x12, 0x04, 0x4e, + 0x61, 0x71, 0x01, 0x17, 0xdc, 0xba, 0xbd, 0x03, 0x15, 0x75, 0x33, 0x24, 0xda, 0x92, 0x26, 0x95, + 0x95, 0x47, 0x14, 0xb1, 0xa4, 0xdb, 0xc3, 0x98, 0x6a, 0x03, 0xe8, 0x92, 0x0e, 0x79, 0xa9, 0xe0, + 0x33, 0x30, 0x50, 0x0b, 0x44, 0x31, 0x9e, 0xb2, 0x26, 0xc3, 0x6c, 0x29, 0x06, 0xb1, 0xaf, 0xc3, + 0xd8, 0x65, 0x3f, 0xb8, 0xc9, 0x2e, 0x70, 0x62, 0xf5, 0x8a, 0x29, 0xe1, 0x0d, 0xfa, 0x23, 0x6d, + 0xb9, 0x33, 0x28, 0xe6, 0x30, 0x55, 0x49, 0xb5, 0xd0, 0xab, 0x92, 0xaa, 0xfd, 0x01, 0x0b, 0x46, + 0x54, 0x6e, 0xf8, 0x85, 0xed, 0x2d, 0x4a, 0xb7, 0x11, 0x06, 0xed, 0x56, 0x9a, 0x2e, 0xbb, 0x84, + 0x16, 0x73, 0x98, 0x59, 0x34, 0xa1, 0xb0, 0x4f, 0xd1, 0x84, 0x33, 0x30, 0xb0, 0xe5, 0xfa, 0xf5, + 0xb4, 0x53, 0xf4, 0xb2, 0xeb, 0xd7, 0x31, 0x83, 0xd8, 0xff, 0xca, 0x82, 0x63, 0xaa, 0x0b, 0xd2, + 0x66, 0x7a, 0x1e, 0x46, 0xd6, 0xdb, 0xae, 0x57, 0x97, 0x85, 0x98, 0x53, 0xcb, 0x65, 0xce, 0x80, + 0xe1, 0x04, 0x26, 0x3a, 0x0b, 0xb0, 0xee, 0xfa, 0x4e, 0xd8, 0x59, 0xd5, 0x46, 0x9a, 0xd2, 0xdb, + 0x73, 0x0a, 0x82, 0x0d, 0x2c, 0xca, 0x2d, 0x22, 0xb1, 0x4e, 0x72, 0xe0, 0x1f, 0x42, 0x71, 0xab, + 0x1a, 0x30, 0x9c, 0xc0, 0xb4, 0x3f, 0x55, 0x84, 0xb1, 0x64, 0x6e, 0x7d, 0x1f, 0x5e, 0x8f, 0xc7, + 0xa0, 0xc4, 0xd2, 0xed, 0xd3, 0x93, 0x82, 0x57, 0x3d, 0xe6, 0x30, 0x14, 0xc1, 0x20, 0x17, 0x03, + 0xf9, 0x5c, 0x01, 0xaa, 0x3a, 0xa9, 0x7c, 0xb0, 0x2c, 0x4a, 0x5b, 0xb8, 0xb4, 0x05, 0x2b, 0xf4, + 0x61, 0x0b, 0x86, 0x82, 0x96, 0x59, 0xbb, 0xf3, 0x5d, 0x79, 0xd6, 0x1d, 0x10, 0xc9, 0xbd, 0xc2, + 0x92, 0x51, 0x93, 0x46, 0x7e, 0x48, 0xc9, 0xfa, 0xf4, 0x0f, 0xc2, 0x88, 0x89, 0xb9, 0x9f, 0x31, + 0x53, 0x36, 0x8d, 0x99, 0x8f, 0x99, 0xd3, 0x49, 0x54, 0x56, 0xe8, 0x63, 0xa1, 0x5e, 0x85, 0x52, + 0x4d, 0x85, 0xb2, 0xdd, 0x51, 0xe1, 0x7f, 0x55, 0x79, 0x8c, 0x85, 0x09, 0x70, 0x6a, 0xf6, 0xd7, + 0x2d, 0x63, 0x7e, 0x60, 0x12, 0x2d, 0xd6, 0x51, 0x08, 0xc5, 0xc6, 0xf6, 0x96, 0x30, 0x10, 0x2e, + 0xe5, 0x34, 0xbc, 0x17, 0xb6, 0xb7, 0xf4, 0x7c, 0x35, 0x5b, 0x31, 0x65, 0xd6, 0xc7, 0x41, 0x41, + 0xa2, 0x00, 0x47, 0x71, 0xff, 0x02, 0x1c, 0xf6, 0x1b, 0x05, 0x98, 0xe8, 0x9a, 0x54, 0xe8, 0x35, + 0x28, 0x85, 0xf4, 0x2d, 0xc5, 0xeb, 0x2d, 0xe5, 0x56, 0x32, 0x23, 0x5a, 0xac, 0x6b, 0xc5, 0x9b, + 0x6c, 0xc7, 0x9c, 0x25, 0xba, 0x04, 0x48, 0x07, 0x5c, 0xaa, 0x53, 0x0a, 0xfe, 0xca, 0x2a, 0x2a, + 0x6b, 0xb6, 0x0b, 0x03, 0x67, 0x3c, 0x85, 0x5e, 0x48, 0x1f, 0x76, 0x14, 0x93, 0xa7, 0x6c, 0x7b, + 0x9d, 0x5b, 0xd8, 0xbf, 0x55, 0x80, 0xd1, 0x44, 0x29, 0x55, 0xe4, 0x41, 0x99, 0x78, 0xec, 0x08, + 0x54, 0xaa, 0xa9, 0xc3, 0x5e, 0x8c, 0xa2, 0x54, 0xeb, 0x39, 0x41, 0x17, 0x2b, 0x0e, 0xf7, 0x47, + 0xb0, 0xd6, 0xf3, 0x30, 0x22, 0x3b, 0xf4, 0x2e, 0xa7, 0xe9, 0x89, 0x01, 0x54, 0x73, 0xf4, 0x9c, + 0x01, 0xc3, 0x09, 0x4c, 0xfb, 0xf7, 0x8a, 0x30, 0xc9, 0xcf, 0x8c, 0xeb, 0x6a, 0xe6, 0xa9, 0xd8, + 0x8f, 0x9f, 0xd7, 0x05, 0x8f, 0xad, 0x3c, 0x6e, 0xff, 0xee, 0xc5, 0xa8, 0xaf, 0x18, 0xe3, 0xcf, + 0xa5, 0x62, 0x8c, 0xf9, 0x9e, 0xb6, 0x71, 0x44, 0x3d, 0xfa, 0xce, 0x0a, 0x3a, 0xfe, 0x27, 0x05, + 0x18, 0x4f, 0x5d, 0xf2, 0x86, 0x3e, 0x95, 0xbc, 0x17, 0xc4, 0xca, 0xe3, 0x3c, 0x6d, 0xcf, 0x7b, + 0xbf, 0x0e, 0x76, 0x3b, 0xc8, 0x3d, 0x5a, 0x2a, 0xf6, 0xd7, 0x0a, 0x30, 0x96, 0xbc, 0x9d, 0xee, + 0x3e, 0x1c, 0xa9, 0xb7, 0x43, 0x85, 0x5d, 0xc0, 0x74, 0x99, 0x74, 0xe4, 0x71, 0x1c, 0xbf, 0xeb, + 0x46, 0x36, 0x62, 0x0d, 0xbf, 0x2f, 0x2e, 0x5d, 0xb1, 0xff, 0x99, 0x05, 0x27, 0xf9, 0x5b, 0xa6, + 0xe7, 0xe1, 0xdf, 0xca, 0x1a, 0xdd, 0x97, 0xf3, 0xed, 0x60, 0xaa, 0x50, 0xf7, 0x7e, 0xe3, 0xcb, + 0xee, 0x40, 0x17, 0xbd, 0x4d, 0x4e, 0x85, 0xfb, 0xb0, 0xb3, 0x07, 0x9a, 0x0c, 0xf6, 0x7f, 0x28, + 0xc0, 0xf0, 0xca, 0xfc, 0xa2, 0x12, 0xe1, 0x33, 0x50, 0xa9, 0x85, 0xc4, 0xd1, 0x7e, 0x12, 0x33, + 0x22, 0x49, 0x02, 0xb0, 0xc6, 0xa1, 0xdb, 0x0d, 0x1e, 0xd1, 0x17, 0xa5, 0xb7, 0x1b, 0x3c, 0xe0, + 0x2f, 0xc2, 0x12, 0x8e, 0x9e, 0x84, 0x32, 0xcb, 0xb5, 0xbd, 0x1a, 0x4a, 0x8d, 0xa3, 0xf7, 0xa0, + 0xac, 0x1d, 0x2f, 0x61, 0x85, 0x41, 0x09, 0xd7, 0x83, 0x5a, 0x44, 0x91, 0x53, 0xae, 0x8b, 0x05, + 0xda, 0x8c, 0x97, 0xb0, 0x84, 0xb3, 0x52, 0x89, 0x6c, 0x7b, 0x4f, 0x91, 0x4b, 0xc9, 0x4e, 0x73, + 0x3f, 0x00, 0x45, 0xd7, 0x38, 0x07, 0x29, 0xa9, 0x99, 0xca, 0x77, 0x1b, 0xea, 0x2f, 0xdf, 0xcd, + 0xfe, 0x5a, 0x11, 0xf4, 0x75, 0xfa, 0xc8, 0x15, 0x05, 0x26, 0x72, 0x29, 0x04, 0x5f, 0xed, 0xf8, + 0x35, 0x7d, 0x71, 0x7f, 0x39, 0x55, 0x5f, 0xe2, 0x67, 0x2d, 0x18, 0x76, 0x7d, 0x37, 0x76, 0x1d, + 0xe6, 0x44, 0xcb, 0xe7, 0x4e, 0x6c, 0xc5, 0x6e, 0x91, 0x53, 0x0e, 0x42, 0xf3, 0x6c, 0x5c, 0x31, + 0xc3, 0x26, 0x67, 0xf4, 0x5e, 0x91, 0x5e, 0x55, 0xcc, 0xad, 0x4a, 0x4b, 0x39, 0x95, 0x53, 0xd5, + 0xa2, 0x06, 0x6d, 0x1c, 0xe6, 0x54, 0xdc, 0x08, 0x53, 0x52, 0xea, 0x4e, 0x11, 0xb5, 0x65, 0x60, + 0xcd, 0x98, 0x33, 0xb2, 0x23, 0x40, 0xdd, 0x63, 0x71, 0xc0, 0xd4, 0x95, 0x19, 0xa8, 0x38, 0xed, + 0x38, 0x68, 0xd2, 0x61, 0x12, 0x27, 0xeb, 0x3a, 0x39, 0x47, 0x02, 0xb0, 0xc6, 0xb1, 0x3f, 0x55, + 0x82, 0x54, 0xb9, 0x07, 0xb4, 0x03, 0x15, 0x55, 0xf0, 0x21, 0x9f, 0x54, 0x50, 0x3d, 0xa3, 0x54, + 0x67, 0x54, 0x13, 0xd6, 0xcc, 0x50, 0x43, 0xfa, 0x23, 0xf9, 0x6a, 0x7f, 0x31, 0xed, 0x8f, 0xfc, + 0xd1, 0xfe, 0x8e, 0xa7, 0xe8, 0x5c, 0x9d, 0xe1, 0x05, 0xfe, 0xa6, 0xf7, 0x75, 0x5d, 0xee, 0x77, + 0x2b, 0xf8, 0x07, 0xc5, 0x0d, 0x5e, 0x98, 0x44, 0x6d, 0x2f, 0x16, 0xb3, 0xe1, 0xc5, 0x1c, 0x57, + 0x19, 0x27, 0xac, 0xcb, 0x26, 0xf1, 0xff, 0xd8, 0x60, 0x9a, 0x74, 0x30, 0x0f, 0x1e, 0xa9, 0x83, + 0x79, 0x28, 0x57, 0x07, 0xf3, 0x59, 0x00, 0x36, 0xb7, 0x79, 0x88, 0x7d, 0x99, 0xf9, 0xfd, 0x94, + 0x8a, 0xc1, 0x0a, 0x82, 0x0d, 0x2c, 0xfb, 0xfb, 0x21, 0x59, 0xf7, 0x0b, 0x4d, 0xc9, 0x32, 0x63, + 0xfc, 0xe8, 0x8c, 0x65, 0x37, 0x26, 0x2a, 0x82, 0xfd, 0x86, 0x05, 0x66, 0x71, 0x32, 0xf4, 0x2a, + 0xaf, 0x82, 0x66, 0xe5, 0x71, 0x14, 0x63, 0xd0, 0x9d, 0x5e, 0x76, 0x5a, 0xa9, 0xb0, 0x20, 0x59, + 0x0a, 0xed, 0xf4, 0x3b, 0xa0, 0x2c, 0xa1, 0x07, 0x32, 0x96, 0xdf, 0x0f, 0xc7, 0x65, 0xa5, 0x04, + 0x79, 0x6a, 0x22, 0x8e, 0xe7, 0xf7, 0x77, 0xc6, 0x49, 0x0f, 0x5b, 0xa1, 0x97, 0x87, 0x4d, 0xed, + 0xfe, 0x8b, 0x3d, 0xeb, 0x9b, 0xff, 0xa6, 0x05, 0x67, 0xd2, 0x1d, 0x88, 0x96, 0x03, 0xdf, 0x8d, + 0x83, 0xb0, 0x4a, 0xe2, 0xd8, 0xf5, 0x1b, 0xac, 0x58, 0xed, 0x4d, 0x27, 0x94, 0x17, 0x16, 0x31, + 0x41, 0x79, 0xdd, 0x09, 0x7d, 0xcc, 0x5a, 0x51, 0x07, 0x06, 0x79, 0x4c, 0xb2, 0xd8, 0x05, 0x1d, + 0x72, 0x6d, 0x64, 0x0c, 0x87, 0xde, 0x86, 0xf1, 0x78, 0x68, 0x2c, 0x18, 0xda, 0xdf, 0xb4, 0x00, + 0xad, 0x6c, 0x93, 0x30, 0x74, 0xeb, 0x46, 0x14, 0x35, 0xbb, 0x09, 0xd3, 0xb8, 0xf1, 0xd2, 0xac, + 0xe3, 0x91, 0xba, 0x09, 0xd3, 0xf8, 0x97, 0x7d, 0x13, 0x66, 0xe1, 0x60, 0x37, 0x61, 0xa2, 0x15, + 0x38, 0xd9, 0xe4, 0xdb, 0x38, 0x7e, 0xbb, 0x1c, 0xdf, 0xd3, 0xa9, 0x94, 0xf3, 0x53, 0xb7, 0x76, + 0xa7, 0x4e, 0x2e, 0x67, 0x21, 0xe0, 0xec, 0xe7, 0xec, 0x77, 0x00, 0xe2, 0xc1, 0xd3, 0xf3, 0x59, + 0xf1, 0x9f, 0x3d, 0xdd, 0x5a, 0xf6, 0x67, 0x4b, 0x30, 0x9e, 0xba, 0xce, 0x82, 0x6e, 0xa1, 0xbb, + 0x03, 0x4e, 0x0f, 0xad, 0xbf, 0xbb, 0xbb, 0xd7, 0x57, 0x08, 0xab, 0x0f, 0x25, 0xd7, 0x6f, 0xb5, + 0xe3, 0x7c, 0x2a, 0x5e, 0xf0, 0x4e, 0x2c, 0x52, 0x82, 0x86, 0x03, 0x9f, 0xfe, 0xc5, 0x9c, 0x4d, + 0x9e, 0x01, 0xb1, 0x89, 0x4d, 0xce, 0xc0, 0x3d, 0x72, 0xb3, 0x7c, 0x50, 0x87, 0xa7, 0x96, 0xf2, + 0x70, 0xd8, 0xa6, 0x26, 0xcb, 0x51, 0xc7, 0x24, 0x7d, 0xb1, 0x00, 0xc3, 0xc6, 0x47, 0x43, 0xbf, + 0x9c, 0x2c, 0xdd, 0x69, 0xe5, 0xf7, 0x4a, 0x8c, 0xfe, 0xb4, 0x2e, 0xce, 0xc9, 0x5f, 0xe9, 0xf1, + 0xee, 0xaa, 0x9d, 0xb7, 0x77, 0xa7, 0x8e, 0xa5, 0xea, 0x72, 0x26, 0x2a, 0x79, 0x9e, 0xfe, 0x49, + 0x18, 0x4f, 0x91, 0xc9, 0x78, 0xe5, 0x35, 0xf3, 0x95, 0x0f, 0xed, 0xee, 0x33, 0x87, 0xec, 0x0b, + 0x74, 0xc8, 0x44, 0xa2, 0x7d, 0xe0, 0x91, 0x3e, 0x7c, 0xdb, 0xa9, 0xfd, 0x45, 0xa1, 0xcf, 0x7a, + 0x1a, 0x4f, 0x40, 0xb9, 0x15, 0x78, 0x6e, 0xcd, 0x55, 0x95, 0xbf, 0x59, 0x05, 0x8f, 0x55, 0xd1, + 0x86, 0x15, 0x14, 0xdd, 0x84, 0xca, 0x8d, 0x9b, 0x31, 0x3f, 0x8f, 0x13, 0xe7, 0x06, 0x79, 0x1d, + 0xc3, 0x29, 0xa3, 0x45, 0x1d, 0xf8, 0x61, 0xcd, 0x0b, 0xd9, 0x30, 0xc8, 0x94, 0xa0, 0x4c, 0xba, + 0x63, 0x67, 0x1a, 0x4c, 0x3b, 0x46, 0x58, 0x40, 0xec, 0x6f, 0x03, 0x9c, 0xc8, 0xba, 0x53, 0x08, + 0xbd, 0x0f, 0x06, 0x79, 0x1f, 0xf3, 0xb9, 0xb6, 0x2e, 0x8b, 0xc7, 0x05, 0x46, 0x50, 0x74, 0x8b, + 0xfd, 0xc6, 0x82, 0xa7, 0xe0, 0xee, 0x39, 0xeb, 0x62, 0x86, 0x1c, 0x0d, 0xf7, 0x25, 0x47, 0x73, + 0x5f, 0x72, 0x38, 0x77, 0xcf, 0x59, 0x47, 0x3b, 0x50, 0x6a, 0xb8, 0x31, 0x71, 0x84, 0x73, 0xe6, + 0xfa, 0x91, 0x30, 0x27, 0x0e, 0xb7, 0xd2, 0xd8, 0x4f, 0xcc, 0x19, 0xa2, 0xcf, 0x5b, 0x30, 0xbe, + 0x9e, 0x2c, 0xe4, 0x23, 0x84, 0xa7, 0x73, 0x04, 0xf7, 0x46, 0x25, 0x19, 0xf1, 0xab, 0x60, 0x53, + 0x8d, 0x38, 0xdd, 0x1d, 0xf4, 0x21, 0x0b, 0x86, 0x36, 0x5c, 0xcf, 0xb8, 0x98, 0xe3, 0x08, 0x3e, + 0xce, 0x79, 0xc6, 0x40, 0xef, 0x38, 0xf8, 0xff, 0x08, 0x4b, 0xce, 0xbd, 0x34, 0xd5, 0xe0, 0x61, + 0x35, 0xd5, 0xd0, 0x3d, 0xd2, 0x54, 0x1f, 0xb5, 0xa0, 0xa2, 0x46, 0x5a, 0x14, 0x44, 0x79, 0xf7, + 0x11, 0x7e, 0x72, 0xee, 0x91, 0x52, 0x7f, 0xb1, 0x66, 0x8e, 0x5e, 0xb7, 0x60, 0xd8, 0x79, 0xad, + 0x1d, 0x92, 0x3a, 0xd9, 0x0e, 0x5a, 0x91, 0xa8, 0x54, 0xfa, 0x72, 0xfe, 0x9d, 0x99, 0xa5, 0x4c, + 0x16, 0xc8, 0xf6, 0x4a, 0x2b, 0x12, 0x09, 0xc1, 0xba, 0x01, 0x9b, 0x5d, 0x40, 0x3f, 0xa3, 0xf5, + 0x38, 0xe4, 0x51, 0xaf, 0x3a, 0xab, 0x37, 0x47, 0xad, 0xcc, 0x77, 0x0b, 0x30, 0xb5, 0xcf, 0x28, + 0xa0, 0xe7, 0x61, 0x24, 0x08, 0x1b, 0x8e, 0xef, 0xbe, 0x66, 0x56, 0x17, 0x53, 0x96, 0xe2, 0x8a, + 0x01, 0xc3, 0x09, 0x4c, 0xb3, 0xec, 0x4c, 0x61, 0x9f, 0xb2, 0x33, 0x67, 0x60, 0x20, 0x24, 0xad, + 0x20, 0xbd, 0xe1, 0x61, 0xc9, 0x75, 0x0c, 0x82, 0x1e, 0x81, 0xa2, 0xd3, 0x72, 0x85, 0xd7, 0x4f, + 0xed, 0xe3, 0x66, 0x57, 0x17, 0x31, 0x6d, 0x4f, 0x54, 0xc1, 0x2a, 0xdd, 0x95, 0x2a, 0x58, 0x54, + 0x95, 0x89, 0x73, 0xad, 0x41, 0xad, 0xca, 0x92, 0xe7, 0x4d, 0xf6, 0x1b, 0x45, 0x78, 0x64, 0xcf, + 0x39, 0xaf, 0x83, 0xae, 0xad, 0x3d, 0x82, 0xae, 0xe5, 0xf0, 0x14, 0xf6, 0x1b, 0x9e, 0x62, 0x8f, + 0xe1, 0xf9, 0x10, 0x5d, 0xca, 0xb2, 0x2a, 0x5b, 0x3e, 0xb7, 0x99, 0xf7, 0x2a, 0xf2, 0x26, 0x56, + 0xb1, 0x84, 0x62, 0xcd, 0x97, 0xee, 0x63, 0x12, 0x25, 0x57, 0x4a, 0x79, 0xa8, 0xb2, 0x9e, 0x95, + 0xd1, 0xf8, 0xfa, 0xed, 0x55, 0xc7, 0xc5, 0xfe, 0xed, 0x01, 0x78, 0xac, 0x0f, 0x0d, 0x64, 0xce, + 0x62, 0xab, 0xcf, 0x59, 0xfc, 0x1d, 0xfe, 0x99, 0x3e, 0x92, 0xf9, 0x99, 0x70, 0xfe, 0x9f, 0x69, + 0xef, 0x2f, 0xc4, 0x8e, 0x06, 0xfc, 0x88, 0xd4, 0xda, 0x21, 0x4f, 0x40, 0x31, 0x32, 0x6f, 0x17, + 0x45, 0x3b, 0x56, 0x18, 0x74, 0x5f, 0x5a, 0x73, 0xe8, 0xf2, 0x1f, 0xca, 0xa9, 0xc4, 0x86, 0x99, + 0xc4, 0xcb, 0xcd, 0xa2, 0xf9, 0x59, 0x2a, 0x01, 0x38, 0x1b, 0xfb, 0x97, 0x2c, 0x38, 0xdd, 0xdb, + 0x4c, 0x40, 0x4f, 0xc3, 0xf0, 0x3a, 0x0b, 0x07, 0x5c, 0x66, 0x81, 0x43, 0x62, 0xea, 0xb0, 0xf7, + 0xd5, 0xcd, 0xd8, 0xc4, 0x41, 0xf3, 0x30, 0x61, 0xc6, 0x11, 0x2e, 0x1b, 0x11, 0x47, 0xcc, 0x91, + 0xb1, 0x96, 0x06, 0xe2, 0x6e, 0x7c, 0xfb, 0x5b, 0xc5, 0xec, 0x6e, 0x71, 0x73, 0xf2, 0x20, 0xb3, + 0x59, 0xcc, 0xd5, 0x42, 0x1f, 0x12, 0xb7, 0x78, 0xb7, 0x25, 0xee, 0x40, 0x2f, 0x89, 0x8b, 0x16, + 0xe0, 0x98, 0x71, 0xd1, 0x28, 0x2f, 0xba, 0xc2, 0x4f, 0x7f, 0x54, 0xc5, 0xb4, 0xd5, 0x14, 0x1c, + 0x77, 0x3d, 0x71, 0x9f, 0x4f, 0xbd, 0x2f, 0x17, 0xe0, 0x54, 0x4f, 0x0b, 0xfe, 0x2e, 0x69, 0x14, + 0xf3, 0xf3, 0x0f, 0xdc, 0x9d, 0xcf, 0x6f, 0x7e, 0x94, 0xd2, 0xbe, 0x1f, 0xa5, 0x1f, 0xf5, 0xfc, + 0xc7, 0x85, 0x9e, 0x8b, 0x85, 0xee, 0xf8, 0xbe, 0x6b, 0x47, 0xf2, 0x05, 0x18, 0x75, 0x5a, 0x2d, + 0x8e, 0xc7, 0x72, 0x05, 0x52, 0x55, 0x1c, 0x67, 0x4d, 0x20, 0x4e, 0xe2, 0xf6, 0x35, 0xb0, 0x7f, + 0x66, 0x41, 0x05, 0x93, 0x0d, 0x2e, 0xb1, 0xd0, 0x0d, 0x31, 0x44, 0x56, 0x1e, 0xa5, 0xf4, 0xe9, + 0xc0, 0x46, 0x2e, 0xab, 0x2f, 0x9f, 0x35, 0xd8, 0x87, 0xad, 0x09, 0xa0, 0xae, 0x27, 0x2d, 0xf6, + 0xbe, 0x9e, 0xd4, 0xfe, 0x52, 0x85, 0xbe, 0x5e, 0x2b, 0x98, 0x0f, 0x49, 0x3d, 0xa2, 0xdf, 0xb7, + 0x1d, 0x7a, 0x62, 0x92, 0xa8, 0xef, 0x7b, 0x15, 0x2f, 0x61, 0xda, 0x9e, 0x38, 0x08, 0x2c, 0x1c, + 0xa8, 0x86, 0x5d, 0x71, 0xdf, 0x1a, 0x76, 0x2f, 0xc0, 0x68, 0x14, 0x6d, 0xae, 0x86, 0xee, 0xb6, + 0x13, 0x93, 0xcb, 0x44, 0x16, 0xbb, 0xd1, 0xf5, 0x9c, 0xaa, 0x17, 0x35, 0x10, 0x27, 0x71, 0xd1, + 0x05, 0x98, 0xd0, 0x95, 0xe4, 0x48, 0x18, 0xb3, 0x24, 0x3c, 0x3e, 0x13, 0x54, 0x21, 0x13, 0x5d, + 0x7b, 0x4e, 0x20, 0xe0, 0xee, 0x67, 0xa8, 0xcc, 0x4d, 0x34, 0xd2, 0x8e, 0x0c, 0x26, 0x65, 0x6e, + 0x82, 0x0e, 0xed, 0x4b, 0xd7, 0x13, 0x68, 0x19, 0x8e, 0xf3, 0x89, 0x31, 0xdb, 0x6a, 0x19, 0x6f, + 0x34, 0x94, 0xac, 0x5f, 0x7e, 0xa1, 0x1b, 0x05, 0x67, 0x3d, 0x87, 0x9e, 0x83, 0x61, 0xd5, 0xbc, + 0xb8, 0x20, 0xce, 0xb0, 0x94, 0x0f, 0x4d, 0x91, 0x59, 0xac, 0x63, 0x13, 0x0f, 0xbd, 0x0b, 0x1e, + 0xd4, 0x7f, 0x79, 0x52, 0x37, 0x3f, 0xd8, 0x5d, 0x10, 0x45, 0x3a, 0xd5, 0xf5, 0x58, 0x17, 0x32, + 0xd1, 0xea, 0xb8, 0xd7, 0xf3, 0x68, 0x1d, 0x4e, 0x2b, 0xd0, 0x39, 0x3f, 0x66, 0x69, 0x97, 0x11, + 0x99, 0x73, 0x22, 0x16, 0xa2, 0x00, 0xec, 0x3d, 0x6d, 0x41, 0xfd, 0xf4, 0x05, 0x37, 0xbe, 0x98, + 0x85, 0x89, 0x97, 0xf0, 0x1e, 0x54, 0xd0, 0x0c, 0x54, 0x88, 0xef, 0xac, 0x7b, 0x64, 0x65, 0x7e, + 0x91, 0x15, 0xfb, 0x34, 0xce, 0x91, 0xcf, 0x49, 0x00, 0xd6, 0x38, 0x2a, 0xe2, 0x7c, 0xa4, 0x57, + 0xc4, 0x39, 0x5a, 0x85, 0x13, 0x8d, 0x5a, 0x8b, 0x5a, 0x8d, 0x6e, 0x8d, 0xcc, 0xd6, 0x58, 0x98, + 0x2c, 0xfd, 0x30, 0xbc, 0xb0, 0xbc, 0x4a, 0xdd, 0xb9, 0x30, 0xbf, 0xda, 0x85, 0x83, 0x33, 0x9f, + 0x64, 0xe1, 0xd4, 0x61, 0xb0, 0xd3, 0x99, 0x3c, 0x9e, 0x0a, 0xa7, 0xa6, 0x8d, 0x98, 0xc3, 0xd0, + 0x25, 0x40, 0x2c, 0x7d, 0xed, 0x62, 0x1c, 0xb7, 0x94, 0x99, 0x3a, 0x79, 0x22, 0x59, 0xb2, 0xef, + 0x7c, 0x17, 0x06, 0xce, 0x78, 0x8a, 0x5a, 0x3d, 0x7e, 0xc0, 0xa8, 0x4f, 0x3e, 0x98, 0xb4, 0x7a, + 0xae, 0xf0, 0x66, 0x2c, 0xe1, 0xe8, 0xc7, 0x61, 0xb2, 0x1d, 0x11, 0xb6, 0x01, 0xbe, 0x1e, 0x84, + 0x5b, 0x5e, 0xe0, 0xd4, 0x17, 0xd9, 0x3d, 0xa8, 0x71, 0x67, 0x72, 0x92, 0x31, 0x3f, 0x23, 0x9e, + 0x9d, 0xbc, 0xda, 0x03, 0x0f, 0xf7, 0xa4, 0x90, 0xae, 0x39, 0x79, 0xaa, 0xcf, 0x9a, 0x93, 0xab, + 0x70, 0x42, 0xea, 0xb5, 0x95, 0xf9, 0x45, 0xf5, 0xd2, 0x93, 0xa7, 0x93, 0x17, 0xab, 0x2d, 0x66, + 0xe0, 0xe0, 0xcc, 0x27, 0xed, 0x3f, 0xb5, 0x60, 0x54, 0x49, 0xb0, 0xbb, 0x90, 0x46, 0xeb, 0x25, + 0xd3, 0x68, 0x2f, 0x1c, 0x5e, 0x07, 0xb0, 0x9e, 0xf7, 0x48, 0xfa, 0xf8, 0xf4, 0x28, 0x80, 0xd6, + 0x13, 0x4a, 0x45, 0x5b, 0x3d, 0x55, 0xf4, 0x7d, 0x2b, 0xa3, 0xb3, 0x6a, 0x08, 0x96, 0xee, 0x6d, + 0x0d, 0xc1, 0x2a, 0x9c, 0x94, 0x53, 0x8a, 0x9f, 0xdd, 0x5e, 0x0c, 0x22, 0x25, 0xf2, 0x8d, 0x9b, + 0xf2, 0x16, 0xb3, 0x90, 0x70, 0xf6, 0xb3, 0x09, 0xdb, 0x6e, 0x68, 0x5f, 0xdb, 0x4e, 0x49, 0xb9, + 0xa5, 0x0d, 0x79, 0x8f, 0x65, 0x4a, 0xca, 0x2d, 0x9d, 0xaf, 0x62, 0x8d, 0x93, 0xad, 0xea, 0x2a, + 0x39, 0xa9, 0x3a, 0x38, 0xb0, 0xaa, 0x93, 0x42, 0x77, 0xb8, 0xa7, 0xd0, 0x95, 0x67, 0x44, 0x23, + 0x3d, 0xcf, 0x88, 0xde, 0x09, 0x63, 0xae, 0xbf, 0x49, 0x42, 0x37, 0x26, 0x75, 0xb6, 0x16, 0x98, + 0x40, 0x2e, 0x6b, 0x43, 0x67, 0x31, 0x01, 0xc5, 0x29, 0xec, 0xa4, 0xa6, 0x18, 0xeb, 0x43, 0x53, + 0xf4, 0xd0, 0xcf, 0xe3, 0xf9, 0xe8, 0xe7, 0x63, 0x87, 0xd7, 0xcf, 0x13, 0x47, 0xaa, 0x9f, 0x51, + 0x2e, 0xfa, 0xb9, 0x2f, 0xd5, 0x67, 0x6c, 0xd2, 0x4f, 0xec, 0xb3, 0x49, 0xef, 0xa5, 0x9c, 0x4f, + 0xde, 0xb1, 0x72, 0xce, 0xd6, 0xbb, 0x0f, 0xbc, 0xa9, 0x77, 0x73, 0xd1, 0xbb, 0x1f, 0x2d, 0xc0, + 0x49, 0xad, 0x99, 0xa8, 0x3c, 0x70, 0x37, 0xa8, 0x6c, 0x66, 0x97, 0x43, 0xf3, 0x93, 0x65, 0x23, + 0x79, 0x5b, 0xa7, 0xaf, 0x2b, 0x08, 0x36, 0xb0, 0x58, 0x0e, 0x34, 0x09, 0xd9, 0xb5, 0x24, 0x69, + 0xb5, 0x35, 0x2f, 0xda, 0xb1, 0xc2, 0xa0, 0x83, 0x40, 0x7f, 0x8b, 0x12, 0x1c, 0xe9, 0x82, 0xd7, + 0xf3, 0x1a, 0x84, 0x4d, 0x3c, 0xf4, 0x04, 0x67, 0xc2, 0x44, 0x26, 0x55, 0x5d, 0x23, 0x7c, 0x5b, + 0xa9, 0xa4, 0xa4, 0x82, 0xca, 0xee, 0xb0, 0x1c, 0xfd, 0x52, 0x77, 0x77, 0x58, 0x90, 0xa6, 0xc2, + 0xb0, 0xff, 0xa7, 0x05, 0xa7, 0x32, 0x87, 0xe2, 0x2e, 0x98, 0x23, 0x3b, 0x49, 0x73, 0xa4, 0x9a, + 0xd7, 0x96, 0xd4, 0x78, 0x8b, 0x1e, 0xa6, 0xc9, 0x7f, 0xb4, 0x60, 0x4c, 0xe3, 0xdf, 0x85, 0x57, + 0x75, 0x93, 0xaf, 0x9a, 0xdf, 0xee, 0xbb, 0xd2, 0xf5, 0x6e, 0xbf, 0x57, 0x00, 0x55, 0x84, 0x7e, + 0xb6, 0x26, 0xaf, 0xf8, 0xd8, 0x27, 0xd6, 0xa1, 0x03, 0x83, 0x2c, 0x54, 0x23, 0xca, 0x27, 0x0c, + 0x2d, 0xc9, 0x9f, 0x85, 0x7d, 0xe8, 0x93, 0x33, 0xf6, 0x37, 0xc2, 0x82, 0x21, 0xbb, 0x34, 0x87, + 0xd7, 0xf7, 0xae, 0x8b, 0x0c, 0x52, 0x7d, 0x69, 0x8e, 0x68, 0xc7, 0x0a, 0x83, 0x2a, 0x4c, 0xb7, + 0x16, 0xf8, 0xf3, 0x9e, 0x13, 0x45, 0xc2, 0x86, 0x53, 0x0a, 0x73, 0x51, 0x02, 0xb0, 0xc6, 0x61, + 0x51, 0x1c, 0x6e, 0xd4, 0xf2, 0x9c, 0x8e, 0xe1, 0x63, 0x31, 0x4a, 0x4d, 0x29, 0x10, 0x36, 0xf1, + 0xec, 0x26, 0x4c, 0x26, 0x5f, 0x62, 0x81, 0x6c, 0xb0, 0x10, 0xea, 0xbe, 0x86, 0x73, 0x06, 0x2a, + 0x0e, 0x7b, 0x6a, 0xa9, 0xed, 0x08, 0x99, 0xa0, 0x03, 0x89, 0x25, 0x00, 0x6b, 0x1c, 0xfb, 0x9f, + 0x5a, 0x70, 0x3c, 0x63, 0xd0, 0x72, 0x4c, 0x95, 0x8e, 0xb5, 0xb4, 0xc9, 0x32, 0x75, 0xbe, 0x0f, + 0x86, 0xea, 0x64, 0xc3, 0x91, 0x41, 0xba, 0x66, 0x4c, 0x3f, 0x6f, 0xc6, 0x12, 0x6e, 0xff, 0x56, + 0x01, 0xc6, 0x93, 0x7d, 0x8d, 0x58, 0x12, 0x21, 0x1f, 0x26, 0x37, 0xaa, 0x05, 0xdb, 0x24, 0xec, + 0xd0, 0x37, 0xb7, 0x52, 0x49, 0x84, 0x5d, 0x18, 0x38, 0xe3, 0x29, 0x76, 0x05, 0x45, 0x5d, 0x8d, + 0xb6, 0x9c, 0x91, 0xd7, 0xf2, 0x9c, 0x91, 0xfa, 0x63, 0x9a, 0x01, 0x3d, 0x8a, 0x25, 0x36, 0xf9, + 0x53, 0x93, 0x8b, 0x65, 0x65, 0xcc, 0xb5, 0x5d, 0x2f, 0x76, 0x7d, 0xf1, 0xca, 0x62, 0xae, 0x2a, + 0x93, 0x6b, 0xb9, 0x1b, 0x05, 0x67, 0x3d, 0x67, 0x7f, 0x73, 0x00, 0x54, 0x19, 0x10, 0x16, 0x70, + 0x99, 0x53, 0xb8, 0xea, 0x41, 0x53, 0x51, 0xd5, 0xdc, 0x1a, 0xd8, 0x2b, 0x02, 0x8a, 0x3b, 0xe6, + 0x4c, 0x0f, 0xbe, 0x1a, 0xb0, 0x35, 0x0d, 0xc2, 0x26, 0x1e, 0xed, 0x89, 0xe7, 0x6e, 0x13, 0xfe, + 0xd0, 0x60, 0xb2, 0x27, 0x4b, 0x12, 0x80, 0x35, 0x0e, 0xab, 0x38, 0xed, 0x6e, 0x6c, 0x08, 0x2f, + 0x93, 0xae, 0x38, 0xed, 0x6e, 0x6c, 0x60, 0x06, 0xe1, 0x97, 0x14, 0x05, 0x5b, 0x62, 0x9b, 0x61, + 0x5c, 0x52, 0x14, 0x6c, 0x61, 0x06, 0xa1, 0x5f, 0xc9, 0x0f, 0xc2, 0xa6, 0xe3, 0xb9, 0xaf, 0x91, + 0xba, 0xe2, 0x22, 0xb6, 0x17, 0xea, 0x2b, 0x5d, 0xe9, 0x46, 0xc1, 0x59, 0xcf, 0xd1, 0x09, 0xdd, + 0x0a, 0x49, 0xdd, 0xad, 0xc5, 0x26, 0x35, 0x48, 0x4e, 0xe8, 0xd5, 0x2e, 0x0c, 0x9c, 0xf1, 0x14, + 0x9a, 0x85, 0x71, 0x59, 0xc6, 0x45, 0x96, 0x3e, 0x1c, 0x4e, 0xd6, 0x4f, 0xc3, 0x49, 0x30, 0x4e, + 0xe3, 0x53, 0x21, 0xd9, 0x14, 0x85, 0x5b, 0xd9, 0x6e, 0xc4, 0x10, 0x92, 0xb2, 0xa0, 0x2b, 0x56, + 0x18, 0xf6, 0x07, 0x8b, 0x54, 0xa9, 0xf7, 0xa8, 0x8f, 0x7c, 0xd7, 0xc2, 0xa3, 0x93, 0x33, 0x72, + 0xa0, 0x8f, 0x19, 0xf9, 0x2c, 0x8c, 0xdc, 0x88, 0x02, 0x5f, 0x85, 0x1e, 0x97, 0x7a, 0x86, 0x1e, + 0x1b, 0x58, 0xd9, 0xa1, 0xc7, 0x83, 0x79, 0x85, 0x1e, 0x0f, 0xdd, 0x61, 0xe8, 0xf1, 0x1f, 0x94, + 0x40, 0xdd, 0x42, 0x79, 0x85, 0xc4, 0x37, 0x83, 0x70, 0xcb, 0xf5, 0x1b, 0xac, 0x24, 0xc9, 0xe7, + 0x2d, 0x59, 0xd5, 0x64, 0xc9, 0x4c, 0xc9, 0xdd, 0xc8, 0xe9, 0x26, 0xc1, 0x04, 0xb3, 0xe9, 0x35, + 0x83, 0x11, 0x0f, 0x61, 0x49, 0x55, 0x4f, 0x11, 0x87, 0x06, 0x89, 0x1e, 0xa1, 0x9f, 0x04, 0x90, + 0x2e, 0xf9, 0x0d, 0x29, 0x81, 0x17, 0xf3, 0xe9, 0x1f, 0x26, 0x1b, 0xda, 0xa4, 0x5e, 0x53, 0x4c, + 0xb0, 0xc1, 0x10, 0x7d, 0x54, 0xa7, 0x2b, 0xf3, 0x1c, 0xa5, 0xf7, 0x1e, 0xc9, 0xd8, 0xf4, 0x93, + 0xac, 0x8c, 0x61, 0xc8, 0xf5, 0x1b, 0x74, 0x9e, 0x88, 0x10, 0xcd, 0xb7, 0x65, 0x55, 0xbc, 0x5a, + 0x0a, 0x9c, 0xfa, 0x9c, 0xe3, 0x39, 0x7e, 0x8d, 0x84, 0x8b, 0x1c, 0x5d, 0x6b, 0x50, 0xd1, 0x80, + 0x25, 0xa1, 0xae, 0xab, 0x32, 0x4b, 0xfd, 0x5c, 0x95, 0x79, 0xfa, 0x47, 0x60, 0xa2, 0xeb, 0x63, + 0x1e, 0x28, 0x37, 0xf9, 0x10, 0xb5, 0xae, 0x7e, 0x7b, 0x50, 0x2b, 0xad, 0x2b, 0x41, 0x9d, 0xdf, + 0xbc, 0x18, 0xea, 0x2f, 0x2a, 0x4c, 0xe6, 0x1c, 0xa7, 0x88, 0x52, 0x33, 0x46, 0x23, 0x36, 0x59, + 0xd2, 0x39, 0xda, 0x72, 0x42, 0xe2, 0x1f, 0xf5, 0x1c, 0x5d, 0x55, 0x4c, 0xb0, 0xc1, 0x10, 0x6d, + 0x26, 0x92, 0xe8, 0xce, 0x1f, 0x3e, 0x89, 0x8e, 0xd5, 0x1f, 0xcd, 0xba, 0xa0, 0xec, 0x75, 0x0b, + 0xc6, 0xfc, 0xc4, 0xcc, 0xcd, 0x27, 0x6e, 0x3e, 0x7b, 0x55, 0xf0, 0x4b, 0x8c, 0x93, 0x6d, 0x38, + 0xc5, 0x3f, 0x4b, 0xa5, 0x95, 0x0e, 0xa8, 0xd2, 0xf4, 0xcd, 0xaf, 0x83, 0xbd, 0x6e, 0x7e, 0x45, + 0xbe, 0xba, 0x92, 0x7b, 0x28, 0x8f, 0xba, 0x1f, 0x89, 0xfb, 0xb8, 0x21, 0xe3, 0x2e, 0xee, 0xeb, + 0x66, 0x8e, 0xed, 0xc1, 0xaf, 0x66, 0x1e, 0xed, 0x95, 0x8b, 0x6b, 0xff, 0x9f, 0x01, 0x38, 0x26, + 0x47, 0x44, 0xe6, 0xdc, 0x50, 0xfd, 0xc8, 0xf9, 0x6a, 0x5b, 0x59, 0xe9, 0xc7, 0x8b, 0x12, 0x80, + 0x35, 0x0e, 0xb5, 0xc7, 0xda, 0x11, 0x59, 0x69, 0x11, 0x7f, 0xc9, 0x5d, 0x8f, 0xc4, 0xf1, 0xbb, + 0x5a, 0x28, 0x57, 0x35, 0x08, 0x9b, 0x78, 0x2c, 0x11, 0xd8, 0x30, 0x5a, 0xcd, 0x44, 0x60, 0x61, + 0xa8, 0x4a, 0x38, 0xfa, 0x4c, 0xe6, 0x85, 0x0d, 0xf9, 0x64, 0xaa, 0x76, 0xa5, 0x1a, 0x1d, 0xec, + 0xa6, 0x06, 0xf4, 0x0f, 0x2d, 0x38, 0xc9, 0x5b, 0xe5, 0x48, 0x5e, 0x6d, 0xd5, 0x9d, 0x98, 0x44, + 0xf9, 0x5c, 0x6e, 0x95, 0xd1, 0x3f, 0xed, 0x45, 0xcf, 0x62, 0x8b, 0xb3, 0x7b, 0x83, 0x3e, 0x65, + 0xc1, 0xf8, 0x56, 0xa2, 0xec, 0x94, 0x54, 0x1d, 0x87, 0xad, 0xeb, 0x92, 0x20, 0xaa, 0x97, 0x5a, + 0xb2, 0x3d, 0xc2, 0x69, 0xee, 0xf6, 0x5f, 0x5a, 0x60, 0x8a, 0xd1, 0xbb, 0x5f, 0xad, 0xea, 0xe0, + 0xa6, 0xa0, 0xb4, 0x2e, 0x4b, 0x3d, 0xad, 0xcb, 0x47, 0xa0, 0xd8, 0x76, 0xeb, 0x62, 0x7f, 0xa1, + 0x0f, 0xfc, 0x17, 0x17, 0x30, 0x6d, 0xb7, 0xbf, 0x51, 0xd2, 0x6e, 0x10, 0x91, 0x08, 0xfa, 0x5d, + 0xf1, 0xda, 0x1b, 0xaa, 0x0c, 0x2d, 0x7f, 0xf3, 0x2b, 0x5d, 0x65, 0x68, 0x7f, 0xe8, 0xe0, 0x79, + 0xbe, 0x7c, 0x80, 0x7a, 0x55, 0xa1, 0x1d, 0xda, 0x27, 0xc9, 0xf7, 0x06, 0x94, 0xe9, 0x16, 0x8c, + 0xf9, 0x33, 0xcb, 0x89, 0x4e, 0x95, 0x2f, 0x8a, 0xf6, 0xdb, 0xbb, 0x53, 0x3f, 0x78, 0xf0, 0x6e, + 0xc9, 0xa7, 0xb1, 0xa2, 0x8f, 0x22, 0xa8, 0xd0, 0xdf, 0x2c, 0x1f, 0x59, 0x6c, 0xee, 0xae, 0x2a, + 0x99, 0x29, 0x01, 0xb9, 0x24, 0x3b, 0x6b, 0x3e, 0xc8, 0x87, 0x0a, 0x45, 0xe4, 0x4c, 0xf9, 0x1e, + 0x70, 0x55, 0x65, 0x05, 0x4b, 0xc0, 0xed, 0xdd, 0xa9, 0x17, 0x0e, 0xce, 0x54, 0x3d, 0x8e, 0x35, + 0x0b, 0x43, 0x35, 0x0e, 0xf7, 0xbc, 0x14, 0xfd, 0xff, 0x0e, 0xe8, 0xf9, 0x2d, 0x2a, 0x14, 0x7f, + 0x57, 0xcc, 0xef, 0xe7, 0x53, 0xf3, 0xfb, 0x4c, 0xd7, 0xfc, 0x1e, 0xa3, 0x63, 0x96, 0x51, 0x37, + 0xf9, 0x6e, 0x1b, 0x0b, 0xfb, 0xfb, 0x24, 0x98, 0x95, 0xf4, 0x6a, 0xdb, 0x0d, 0x49, 0xb4, 0x1a, + 0xb6, 0x7d, 0xd7, 0x6f, 0xb0, 0x29, 0x5b, 0x36, 0xad, 0xa4, 0x04, 0x18, 0xa7, 0xf1, 0xe9, 0xc6, + 0x9f, 0xce, 0x8b, 0xeb, 0xce, 0x36, 0x9f, 0x79, 0x46, 0x75, 0xc8, 0xaa, 0x68, 0xc7, 0x0a, 0x03, + 0x6d, 0xc2, 0xc3, 0x92, 0xc0, 0x02, 0xf1, 0x08, 0x7d, 0x21, 0x16, 0xc8, 0x18, 0x36, 0x79, 0xda, + 0x00, 0x8f, 0x45, 0x79, 0xab, 0xa0, 0xf0, 0x30, 0xde, 0x03, 0x17, 0xef, 0x49, 0xc9, 0xfe, 0x02, + 0x0b, 0x5d, 0x30, 0xca, 0x32, 0xd0, 0xd9, 0xe7, 0xb9, 0x4d, 0x57, 0x16, 0xb1, 0x54, 0xb3, 0x6f, + 0x89, 0x36, 0x62, 0x0e, 0x43, 0x37, 0x61, 0x68, 0x9d, 0x5f, 0x96, 0x9e, 0xcf, 0x25, 0x45, 0xe2, + 0xe6, 0x75, 0x56, 0xc0, 0x5a, 0x5e, 0xc3, 0x7e, 0x5b, 0xff, 0xc4, 0x92, 0x9b, 0xfd, 0xd5, 0x12, + 0x8c, 0xcb, 0xf0, 0xb2, 0x8b, 0x6e, 0xc4, 0x22, 0x12, 0xcc, 0xaa, 0xfe, 0x85, 0x7d, 0xab, 0xfa, + 0xbf, 0x07, 0xa0, 0x4e, 0x5a, 0x5e, 0xd0, 0x61, 0xc6, 0xe1, 0xc0, 0x81, 0x8d, 0x43, 0xb5, 0x9f, + 0x58, 0x50, 0x54, 0xb0, 0x41, 0x51, 0x54, 0xee, 0xe4, 0x97, 0x04, 0xa4, 0x2a, 0x77, 0x1a, 0x57, + 0x99, 0x0d, 0xde, 0xdd, 0xab, 0xcc, 0x5c, 0x18, 0xe7, 0x5d, 0x54, 0xc5, 0x0f, 0xee, 0xa0, 0xc6, + 0x01, 0x4b, 0x1f, 0x5b, 0x48, 0x92, 0xc1, 0x69, 0xba, 0xe6, 0x3d, 0x65, 0xe5, 0xbb, 0x7d, 0x4f, + 0xd9, 0xdb, 0xa1, 0x22, 0xbf, 0x73, 0x34, 0x59, 0xd1, 0x85, 0x79, 0xe4, 0x34, 0x88, 0xb0, 0x86, + 0x77, 0xd5, 0x71, 0x81, 0x7b, 0x55, 0xc7, 0xc5, 0x7e, 0xbd, 0x48, 0x77, 0x15, 0xbc, 0x5f, 0x07, + 0xbe, 0xe6, 0xef, 0xa2, 0x71, 0xcd, 0xdf, 0xc1, 0xbe, 0x67, 0x39, 0x75, 0x1d, 0xe0, 0xc3, 0x30, + 0x10, 0x3b, 0x0d, 0x99, 0xed, 0xca, 0xa0, 0x6b, 0x4e, 0x23, 0xc2, 0xac, 0xf5, 0x20, 0x85, 0x8e, + 0x5f, 0x80, 0xd1, 0xc8, 0x6d, 0xf8, 0x4e, 0xdc, 0x0e, 0x89, 0x71, 0x7e, 0xa9, 0x83, 0x74, 0x4c, + 0x20, 0x4e, 0xe2, 0xa2, 0x0f, 0x59, 0x00, 0x21, 0x51, 0x7b, 0x96, 0xc1, 0x3c, 0xe6, 0x90, 0x12, + 0x03, 0x92, 0xae, 0x59, 0x7f, 0x43, 0xed, 0x55, 0x0c, 0xb6, 0xf6, 0x47, 0x2c, 0x98, 0xe8, 0x7a, + 0x0a, 0xb5, 0x60, 0xb0, 0xc6, 0x2e, 0x63, 0xcc, 0xa7, 0xc0, 0x63, 0xf2, 0x62, 0x47, 0xae, 0x9c, + 0x78, 0x1b, 0x16, 0x7c, 0xec, 0x2f, 0x8d, 0xc0, 0x89, 0xea, 0xfc, 0xb2, 0xbc, 0x9a, 0xe7, 0xc8, + 0xd2, 0x77, 0xb3, 0x78, 0xdc, 0xbd, 0xf4, 0xdd, 0x1e, 0xdc, 0x3d, 0x23, 0x7d, 0xd7, 0x33, 0xd2, + 0x77, 0x93, 0xb9, 0x94, 0xc5, 0x3c, 0x72, 0x29, 0xb3, 0x7a, 0xd0, 0x4f, 0x2e, 0xe5, 0x91, 0xe5, + 0xf3, 0xee, 0xd9, 0xa1, 0x03, 0xe5, 0xf3, 0xaa, 0x64, 0xe7, 0x5c, 0x32, 0xc4, 0x7a, 0x7c, 0xaa, + 0xcc, 0x64, 0x67, 0x95, 0x68, 0xca, 0xb3, 0x1f, 0x85, 0xd2, 0x7b, 0x39, 0xff, 0x0e, 0xf4, 0x91, + 0x68, 0x2a, 0x12, 0x30, 0xcd, 0xe4, 0xe6, 0xa1, 0x3c, 0x92, 0x9b, 0xb3, 0xba, 0xb3, 0x6f, 0x72, + 0xf3, 0x0b, 0x30, 0x5a, 0xf3, 0x02, 0x9f, 0xac, 0x86, 0x41, 0x1c, 0xd4, 0x02, 0x79, 0xf5, 0xb5, + 0xbe, 0xc5, 0xd0, 0x04, 0xe2, 0x24, 0x6e, 0xaf, 0xcc, 0xe8, 0xca, 0x61, 0x33, 0xa3, 0xe1, 0x1e, + 0x65, 0x46, 0x1b, 0xb9, 0xbf, 0xc3, 0x79, 0xe4, 0xfe, 0x66, 0x7d, 0x91, 0xbe, 0xee, 0xb6, 0x7e, + 0x83, 0xdf, 0xfc, 0x4e, 0x37, 0x23, 0x5c, 0x0a, 0xb3, 0x23, 0xba, 0xe1, 0xb3, 0xaf, 0x1c, 0xc1, + 0x84, 0xbd, 0x5e, 0xd5, 0x6c, 0xd4, 0x6d, 0xf0, 0xba, 0x09, 0x27, 0x3b, 0x72, 0x98, 0xb4, 0xe4, + 0xcf, 0x16, 0xe0, 0x7b, 0xf6, 0xed, 0x02, 0xba, 0x09, 0x10, 0x3b, 0x0d, 0x31, 0x51, 0xc5, 0x41, + 0xd6, 0x21, 0xe3, 0x8a, 0xd7, 0x24, 0x3d, 0x5e, 0x1c, 0x4b, 0xfd, 0x65, 0x47, 0x44, 0xf2, 0x37, + 0x0b, 0x27, 0x0e, 0xbc, 0xae, 0xda, 0xcc, 0x38, 0xf0, 0x08, 0x66, 0x10, 0x6a, 0x08, 0x85, 0xa4, + 0x41, 0x8d, 0xfb, 0x62, 0xd2, 0x10, 0xc2, 0xac, 0x15, 0x0b, 0x28, 0x7a, 0x0e, 0x86, 0x1d, 0xcf, + 0xe3, 0xe9, 0x7b, 0x24, 0x12, 0xd7, 0x8b, 0xea, 0x22, 0xb1, 0x1a, 0x84, 0x4d, 0x3c, 0xfb, 0x2f, + 0x0a, 0x30, 0xb5, 0x8f, 0x4c, 0xe9, 0x4a, 0xdb, 0x2e, 0xf5, 0x9d, 0xb6, 0x2d, 0xd2, 0x95, 0x06, + 0x7b, 0xa4, 0x2b, 0x3d, 0x07, 0xc3, 0x31, 0x71, 0x9a, 0x22, 0x12, 0x31, 0x5d, 0xfb, 0x70, 0x4d, + 0x83, 0xb0, 0x89, 0x47, 0xa5, 0xd8, 0x98, 0x53, 0xab, 0x91, 0x28, 0x92, 0xf9, 0x48, 0xc2, 0xcb, + 0x9d, 0x5b, 0xb2, 0x13, 0x3b, 0x3c, 0x98, 0x4d, 0xb0, 0xc0, 0x29, 0x96, 0xe9, 0x01, 0xaf, 0xf4, + 0x39, 0xe0, 0xbf, 0x52, 0x80, 0x47, 0xf6, 0xd4, 0x6e, 0x7d, 0xa7, 0x8a, 0xb5, 0x23, 0x12, 0xa6, + 0x27, 0xce, 0xd5, 0x88, 0x84, 0x98, 0x41, 0xf8, 0x28, 0xb5, 0x5a, 0x2a, 0x8a, 0x3c, 0xff, 0xdc, + 0x4a, 0x3e, 0x4a, 0x09, 0x16, 0x38, 0xc5, 0xf2, 0x4e, 0xa7, 0xe5, 0x57, 0x07, 0xe0, 0xb1, 0x3e, + 0x6c, 0x80, 0x1c, 0x73, 0x50, 0x93, 0xf9, 0xd2, 0xc5, 0x7b, 0x94, 0x2f, 0x7d, 0x67, 0xc3, 0xf5, + 0x66, 0x9a, 0x75, 0x5f, 0xb9, 0xae, 0x5f, 0x28, 0xc0, 0xe9, 0xde, 0x06, 0x0b, 0xfa, 0x61, 0x18, + 0x0f, 0x55, 0x48, 0xa2, 0x99, 0x6a, 0x7d, 0x9c, 0xfb, 0xb8, 0x12, 0x20, 0x9c, 0xc6, 0x45, 0xd3, + 0x00, 0x2d, 0x27, 0xde, 0x8c, 0xce, 0xed, 0xb8, 0x51, 0x2c, 0x8a, 0xc6, 0x8d, 0xf1, 0x93, 0x57, + 0xd9, 0x8a, 0x0d, 0x0c, 0xca, 0x8e, 0xfd, 0x5b, 0x08, 0xae, 0x04, 0x31, 0x7f, 0x88, 0x6f, 0x3d, + 0x8f, 0xcb, 0xbb, 0x08, 0x0d, 0x10, 0x4e, 0xe3, 0x52, 0x76, 0xec, 0x6c, 0x9f, 0x77, 0x94, 0xef, + 0x49, 0x19, 0xbb, 0x25, 0xd5, 0x8a, 0x0d, 0x8c, 0x74, 0x12, 0x79, 0x69, 0xff, 0x24, 0x72, 0xfb, + 0x5f, 0x16, 0xe0, 0x54, 0x4f, 0x83, 0xb7, 0x3f, 0x31, 0x75, 0xff, 0x25, 0x7e, 0xdf, 0xe1, 0x0a, + 0x3b, 0x50, 0xc2, 0xb0, 0xfd, 0x67, 0x3d, 0x66, 0x9a, 0x48, 0x06, 0xbe, 0xf3, 0x3a, 0x28, 0xf7, + 0xdf, 0x78, 0x76, 0xe5, 0xff, 0x0e, 0x1c, 0x20, 0xff, 0x37, 0xf5, 0x31, 0x4a, 0x7d, 0x6a, 0x87, + 0xff, 0x3a, 0xd0, 0x73, 0x78, 0xe9, 0x06, 0xb9, 0xaf, 0x13, 0x84, 0x05, 0x38, 0xe6, 0xfa, 0xec, + 0x76, 0xd9, 0x6a, 0x7b, 0x5d, 0xd4, 0x11, 0xe3, 0xc5, 0x72, 0x55, 0xf6, 0xcd, 0x62, 0x0a, 0x8e, + 0xbb, 0x9e, 0xb8, 0x0f, 0xf3, 0xb1, 0xef, 0x6c, 0x48, 0x0f, 0x28, 0xb9, 0x57, 0xe0, 0xa4, 0x1c, + 0x8a, 0x4d, 0x27, 0x24, 0x75, 0xa1, 0x6c, 0x23, 0x91, 0x6f, 0x75, 0x8a, 0xe7, 0x6c, 0x65, 0x20, + 0xe0, 0xec, 0xe7, 0xd8, 0x55, 0xa0, 0x41, 0xcb, 0xad, 0x89, 0xad, 0xa0, 0xbe, 0x0a, 0x94, 0x36, + 0x62, 0x0e, 0xd3, 0xfa, 0xa2, 0x72, 0x77, 0xf4, 0xc5, 0x7b, 0xa0, 0xa2, 0xc6, 0x9b, 0xe7, 0x54, + 0xa8, 0x49, 0xde, 0x95, 0x53, 0xa1, 0x66, 0xb8, 0x81, 0xb5, 0xdf, 0x8d, 0xfb, 0xcf, 0xc0, 0x88, + 0xf2, 0x05, 0xf6, 0x7b, 0x21, 0xab, 0xfd, 0xff, 0x0a, 0x90, 0xba, 0x7b, 0x0c, 0xed, 0x40, 0xa5, + 0x2e, 0xef, 0xbc, 0xcf, 0xa7, 0x58, 0xb3, 0xba, 0x42, 0x5f, 0x1f, 0x84, 0xa9, 0x26, 0xac, 0x99, + 0xa1, 0xf7, 0xf1, 0xba, 0xc8, 0x82, 0x75, 0x21, 0x8f, 0x9c, 0xfc, 0xaa, 0xa2, 0x67, 0xde, 0xb8, + 0x28, 0xdb, 0xb0, 0xc1, 0x0f, 0xc5, 0x50, 0xd9, 0x94, 0x77, 0xac, 0xe5, 0x23, 0xee, 0xd4, 0x95, + 0x6d, 0xdc, 0x44, 0x53, 0x7f, 0xb1, 0x66, 0x64, 0xff, 0x69, 0x01, 0x4e, 0x24, 0x3f, 0x80, 0x38, + 0xb8, 0xfc, 0x35, 0x0b, 0x1e, 0xf4, 0x9c, 0x28, 0xae, 0xb6, 0xd9, 0x46, 0x61, 0xa3, 0xed, 0xad, + 0xa4, 0x4a, 0x68, 0x1f, 0xd6, 0xd9, 0xa2, 0x08, 0xa7, 0xef, 0xe4, 0x9b, 0x7b, 0xe8, 0xd6, 0xee, + 0xd4, 0x83, 0x4b, 0xd9, 0xcc, 0x71, 0xaf, 0x5e, 0xa1, 0xd7, 0x2d, 0x38, 0x56, 0x6b, 0x87, 0x21, + 0xf1, 0x63, 0xdd, 0x55, 0xfe, 0x15, 0xaf, 0xe4, 0x32, 0x90, 0xba, 0x83, 0x27, 0xa8, 0x40, 0x9d, + 0x4f, 0xf1, 0xc2, 0x5d, 0xdc, 0xed, 0x9f, 0xa7, 0x9a, 0xb3, 0xe7, 0x7b, 0xfe, 0x35, 0xbb, 0x44, + 0xf0, 0xdb, 0x83, 0x30, 0x9a, 0xa8, 0x13, 0x9e, 0x38, 0xec, 0xb3, 0xf6, 0x3d, 0xec, 0x63, 0x19, + 0x82, 0x6d, 0x5f, 0xde, 0xaf, 0x6e, 0x64, 0x08, 0xb6, 0x7d, 0x82, 0x39, 0x4c, 0x0c, 0x29, 0x6e, + 0xfb, 0x22, 0x17, 0xc0, 0x1c, 0x52, 0xdc, 0xf6, 0xb1, 0x80, 0xa2, 0x0f, 0x58, 0x30, 0xc2, 0x16, + 0x9f, 0x38, 0x2a, 0x15, 0x0a, 0xed, 0x52, 0x0e, 0xcb, 0x5d, 0xd6, 0xc4, 0x67, 0xb1, 0xa3, 0x66, + 0x0b, 0x4e, 0x70, 0x44, 0x1f, 0xb6, 0xa0, 0xa2, 0x2e, 0x73, 0x15, 0x67, 0x23, 0xd5, 0x7c, 0xcb, + 0xb0, 0xa7, 0xa4, 0x9e, 0xaa, 0x87, 0x8d, 0x35, 0x63, 0x14, 0xa9, 0x73, 0xcc, 0xa1, 0xa3, 0x39, + 0xc7, 0x84, 0x8c, 0x33, 0xcc, 0xb7, 0x43, 0xa5, 0xe9, 0xf8, 0xee, 0x06, 0x89, 0x62, 0x7e, 0xb4, + 0x28, 0x6f, 0xdd, 0x90, 0x8d, 0x58, 0xc3, 0xa9, 0xb1, 0x1f, 0xb1, 0x17, 0x8b, 0x8d, 0xb3, 0x40, + 0x66, 0xec, 0x57, 0x75, 0x33, 0x36, 0x71, 0xcc, 0x83, 0x4b, 0xb8, 0xa7, 0x07, 0x97, 0xc3, 0xfb, + 0x1c, 0x5c, 0x56, 0xe1, 0xa4, 0xd3, 0x8e, 0x83, 0x8b, 0xc4, 0xf1, 0x66, 0xe3, 0x98, 0x34, 0x5b, + 0x71, 0xc4, 0x4b, 0xcb, 0x8f, 0x30, 0x17, 0xb0, 0x8a, 0x76, 0xab, 0x12, 0x6f, 0xa3, 0x0b, 0x09, + 0x67, 0x3f, 0x6b, 0xff, 0x73, 0x0b, 0x4e, 0x66, 0x4e, 0x85, 0xfb, 0x37, 0xcf, 0xc0, 0xfe, 0xc5, + 0x12, 0x1c, 0xcf, 0xb8, 0x45, 0x00, 0x75, 0xcc, 0x45, 0x62, 0xe5, 0x11, 0xb2, 0x97, 0x8c, 0x40, + 0x93, 0xdf, 0x26, 0x63, 0x65, 0x1c, 0x2c, 0x16, 0x41, 0xc7, 0x03, 0x14, 0xef, 0x6e, 0x3c, 0x80, + 0x31, 0xd7, 0x07, 0xee, 0xe9, 0x5c, 0x2f, 0xed, 0x33, 0xd7, 0xbf, 0x68, 0xc1, 0x64, 0xb3, 0xc7, + 0x95, 0x60, 0xe2, 0x3c, 0xe9, 0xda, 0xd1, 0x5c, 0x38, 0x36, 0xf7, 0xf0, 0xad, 0xdd, 0xa9, 0x9e, + 0x37, 0xb1, 0xe1, 0x9e, 0xbd, 0xb2, 0xbf, 0x59, 0x04, 0x66, 0xaf, 0xb1, 0x4a, 0xd1, 0x1d, 0xf4, + 0x7e, 0xf3, 0x32, 0x12, 0x2b, 0xaf, 0x8b, 0x33, 0x38, 0x71, 0x75, 0x99, 0x09, 0x1f, 0xc1, 0xac, + 0xbb, 0x4d, 0xd2, 0x92, 0xb0, 0xd0, 0x87, 0x24, 0xf4, 0xe4, 0xad, 0x2f, 0xc5, 0xfc, 0x6f, 0x7d, + 0xa9, 0xa4, 0x6f, 0x7c, 0xd9, 0xfb, 0x13, 0x0f, 0xdc, 0x97, 0x9f, 0xf8, 0x77, 0x2c, 0x2e, 0x78, + 0x52, 0x5f, 0x41, 0x9b, 0x1b, 0xd6, 0x1e, 0xe6, 0xc6, 0x93, 0x50, 0x8e, 0x84, 0x64, 0x16, 0x66, + 0x89, 0x0e, 0x05, 0x13, 0xed, 0x58, 0x61, 0xd0, 0x5d, 0x97, 0xe3, 0x79, 0xc1, 0xcd, 0x73, 0xcd, + 0x56, 0xdc, 0x11, 0x06, 0x8a, 0xda, 0x16, 0xcc, 0x2a, 0x08, 0x36, 0xb0, 0xd0, 0x63, 0x30, 0xc8, + 0x2b, 0x4d, 0x08, 0xe7, 0xce, 0x30, 0x5d, 0x87, 0xbc, 0x0c, 0x45, 0x1d, 0x0b, 0x90, 0xbd, 0x09, + 0xc6, 0xae, 0xe2, 0xce, 0x2f, 0x68, 0x56, 0x17, 0xbe, 0x16, 0x7a, 0x5d, 0xf8, 0x6a, 0xff, 0xfd, + 0x82, 0x60, 0xc5, 0x77, 0x09, 0x3a, 0x32, 0xd0, 0x3a, 0x60, 0x64, 0xe0, 0xfb, 0x00, 0x6a, 0x41, + 0xb3, 0x45, 0xf7, 0xcd, 0x6b, 0x41, 0x3e, 0x9b, 0xad, 0x79, 0x45, 0x4f, 0x8f, 0xaa, 0x6e, 0xc3, + 0x06, 0xbf, 0x84, 0x68, 0x2f, 0xee, 0x2b, 0xda, 0x13, 0x52, 0x6e, 0x60, 0x6f, 0x29, 0x67, 0xff, + 0x85, 0x05, 0x09, 0xab, 0x0f, 0xb5, 0xa0, 0x44, 0xbb, 0xdb, 0x11, 0x02, 0x63, 0x25, 0x3f, 0x13, + 0x93, 0x4a, 0x6a, 0xb1, 0x0a, 0xd9, 0x4f, 0xcc, 0x19, 0x21, 0x4f, 0x44, 0x41, 0xe6, 0xb2, 0xf9, + 0x31, 0x19, 0x5e, 0x0c, 0x82, 0x2d, 0x1e, 0x4c, 0xa4, 0x23, 0x2a, 0xed, 0xe7, 0x61, 0xa2, 0xab, + 0x53, 0xec, 0x52, 0xe7, 0x40, 0xee, 0xe0, 0x8d, 0xd5, 0xc3, 0x0a, 0x3e, 0x60, 0x0e, 0xb3, 0xbf, + 0x60, 0xc1, 0xb1, 0x34, 0x79, 0xf4, 0x86, 0x05, 0x13, 0x51, 0x9a, 0xde, 0x51, 0x8d, 0x9d, 0xca, + 0x76, 0xe8, 0x02, 0xe1, 0xee, 0x4e, 0xd8, 0xff, 0x43, 0x68, 0x83, 0xeb, 0xae, 0x5f, 0x0f, 0x6e, + 0x2a, 0x3b, 0xc9, 0xea, 0x69, 0x27, 0x51, 0xf1, 0x50, 0xdb, 0x24, 0xf5, 0xb6, 0xd7, 0x55, 0x86, + 0xa2, 0x2a, 0xda, 0xb1, 0xc2, 0x60, 0x59, 0xf7, 0x6d, 0xb1, 0x6f, 0x4d, 0x4d, 0xca, 0x05, 0xd1, + 0x8e, 0x15, 0x06, 0x7a, 0x16, 0x46, 0x8c, 0x97, 0x94, 0xf3, 0x92, 0x6d, 0x3a, 0x0c, 0x0d, 0x1e, + 0xe1, 0x04, 0x16, 0x9a, 0x06, 0x50, 0x36, 0x97, 0xd4, 0xd8, 0xcc, 0xd1, 0xae, 0x04, 0x63, 0x84, + 0x0d, 0x0c, 0x56, 0xe3, 0xc2, 0x6b, 0x47, 0xec, 0x24, 0x79, 0x50, 0xdf, 0x9c, 0x30, 0x2f, 0xda, + 0xb0, 0x82, 0x52, 0xe1, 0xd6, 0x74, 0xfc, 0xb6, 0xe3, 0xd1, 0x11, 0x12, 0xae, 0x33, 0xb5, 0x0c, + 0x97, 0x15, 0x04, 0x1b, 0x58, 0xf4, 0x8d, 0x63, 0xb7, 0x49, 0x5e, 0x0a, 0x7c, 0x19, 0xa5, 0xae, + 0x83, 0x0b, 0x44, 0x3b, 0x56, 0x18, 0xe8, 0x79, 0x18, 0x76, 0xfc, 0x3a, 0x37, 0x10, 0x83, 0x50, + 0x9c, 0x51, 0xaa, 0xdd, 0xe7, 0xd5, 0x88, 0xcc, 0x6a, 0x28, 0x36, 0x51, 0xd3, 0xd7, 0x46, 0x40, + 0x9f, 0xd7, 0xd2, 0xfd, 0xb9, 0x05, 0xe3, 0xba, 0x68, 0x11, 0xf3, 0xb0, 0x25, 0x5c, 0x8b, 0xd6, + 0xbe, 0xae, 0xc5, 0x64, 0xed, 0x92, 0x42, 0x5f, 0xb5, 0x4b, 0xcc, 0xb2, 0x22, 0xc5, 0x3d, 0xcb, + 0x8a, 0x7c, 0x2f, 0x0c, 0x6d, 0x91, 0x8e, 0x51, 0x7f, 0x84, 0x29, 0x87, 0xcb, 0xbc, 0x09, 0x4b, + 0x18, 0xb2, 0x61, 0xb0, 0xe6, 0xa8, 0x1a, 0x86, 0x23, 0x22, 0x36, 0x6d, 0x96, 0x21, 0x09, 0x88, + 0xbd, 0x02, 0x15, 0x75, 0xa8, 0x2f, 0x3d, 0x7d, 0x56, 0xb6, 0xa7, 0xaf, 0xaf, 0xf2, 0x06, 0x73, + 0xeb, 0x5f, 0xf9, 0xd6, 0xa3, 0x6f, 0xf9, 0xa3, 0x6f, 0x3d, 0xfa, 0x96, 0x3f, 0xf9, 0xd6, 0xa3, + 0x6f, 0xf9, 0xc0, 0xad, 0x47, 0xad, 0xaf, 0xdc, 0x7a, 0xd4, 0xfa, 0xa3, 0x5b, 0x8f, 0x5a, 0x7f, + 0x72, 0xeb, 0x51, 0xeb, 0x9b, 0xb7, 0x1e, 0xb5, 0x5e, 0xff, 0x2f, 0x8f, 0xbe, 0xe5, 0xa5, 0xcc, + 0xbc, 0x08, 0xfa, 0xe3, 0xa9, 0x5a, 0x7d, 0x66, 0xfb, 0x19, 0x16, 0x9a, 0x4f, 0xd7, 0xf3, 0x8c, + 0x31, 0x89, 0x67, 0xe4, 0x7a, 0xfe, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0x6a, 0x75, 0xdd, 0xda, + 0x71, 0xff, 0x00, 0x00, } func (m *AWSAuthConfig) Marshal() (dAtA []byte, err error) { @@ -10889,6 +10891,14 @@ func (m *KustomizeOptions) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + i-- + if m.SetNamespace { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 i -= len(m.BinaryPath) copy(dAtA[i:], m.BinaryPath) i = encodeVarintGenerated(dAtA, i, uint64(len(m.BinaryPath))) @@ -17988,6 +17998,7 @@ func (m *KustomizeOptions) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = len(m.BinaryPath) n += 1 + l + sovGenerated(uint64(l)) + n += 2 return n } @@ -21362,6 +21373,7 @@ func (this *KustomizeOptions) String() string { s := strings.Join([]string{`&KustomizeOptions{`, `BuildOptions:` + fmt.Sprintf("%v", this.BuildOptions) + `,`, `BinaryPath:` + fmt.Sprintf("%v", this.BinaryPath) + `,`, + `SetNamespace:` + fmt.Sprintf("%v", this.SetNamespace) + `,`, `}`, }, "") return s @@ -39499,6 +39511,26 @@ func (m *KustomizeOptions) Unmarshal(dAtA []byte) error { } m.BinaryPath = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SetNamespace", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.SetNamespace = bool(v != 0) default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/pkg/apis/application/v1alpha1/generated.proto b/pkg/apis/application/v1alpha1/generated.proto index d4312a5bb9665..9306c606bea4d 100644 --- a/pkg/apis/application/v1alpha1/generated.proto +++ b/pkg/apis/application/v1alpha1/generated.proto @@ -1309,6 +1309,8 @@ message KustomizeOptions { // BinaryPath holds optional path to kustomize binary optional string binaryPath = 2; + + optional bool setNamespace = 3; } message KustomizePatch { diff --git a/pkg/apis/application/v1alpha1/types.go b/pkg/apis/application/v1alpha1/types.go index 80106e6968f16..55f479c6c4783 100644 --- a/pkg/apis/application/v1alpha1/types.go +++ b/pkg/apis/application/v1alpha1/types.go @@ -1362,7 +1362,9 @@ type SyncOperation struct { // If omitted, will use the revision specified in app spec. Revisions []string `json:"revisions,omitempty" protobuf:"bytes,11,opt,name=revisions"` // SelfHealAttemptsCount contains the number of auto-heal attempts - SelfHealAttemptsCount int64 `json:"autoHealAttemptsCount,omitempty" protobuf:"bytes,12,opt,name=autoHealAttemptsCount"` + SelfHealAttemptsCount int64 `json:"autoHealAttemptsCount,omitempty" protobuf:"bytes,12,opt,name=autoHealAttemptsCount"` + ChangeRevisions []string `json:"changeRevisions,omitempty" protobuf:"-"` + ChangeRevision string `json:"changeRevision,omitempty" protobuf:"-"` } // IsApplyStrategy returns true if the sync strategy is "apply" @@ -3213,6 +3215,8 @@ type KustomizeOptions struct { BuildOptions string `protobuf:"bytes,1,opt,name=buildOptions"` // BinaryPath holds optional path to kustomize binary BinaryPath string `protobuf:"bytes,2,opt,name=binaryPath"` + + SetNamespace bool `protobuf:"varint,3,opt,name=setNamespace"` } // ApplicationDestinationServiceAccount holds information about the service account to be impersonated for the application sync operation. diff --git a/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go index 6de732c4f50b0..7fab921b4c7bb 100644 --- a/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go @@ -4466,6 +4466,11 @@ func (in *SyncOperation) DeepCopyInto(out *SyncOperation) { *out = make([]string, len(*in)) copy(*out, *in) } + if in.ChangeRevisions != nil { + in, out := &in.ChangeRevisions, &out.ChangeRevisions + *out = make([]string, len(*in)) + copy(*out, *in) + } return } diff --git a/reposerver/apiclient/mocks/RepoServerServiceClient.go b/reposerver/apiclient/mocks/RepoServerServiceClient.go index 6e70c509a0466..08595ffa6917e 100644 --- a/reposerver/apiclient/mocks/RepoServerServiceClient.go +++ b/reposerver/apiclient/mocks/RepoServerServiceClient.go @@ -296,6 +296,93 @@ func (_c *RepoServerServiceClient_GetAppDetails_Call) RunAndReturn(run func(ctx return _c } +// GetChangeRevision provides a mock function for the type RepoServerServiceClient +func (_mock *RepoServerServiceClient) GetChangeRevision(ctx context.Context, in *apiclient.ChangeRevisionRequest, opts ...grpc.CallOption) (*apiclient.ChangeRevisionResponse, error) { + // grpc.CallOption + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _mock.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for GetChangeRevision") + } + + var r0 *apiclient.ChangeRevisionResponse + var r1 error + if returnFunc, ok := ret.Get(0).(func(context.Context, *apiclient.ChangeRevisionRequest, ...grpc.CallOption) (*apiclient.ChangeRevisionResponse, error)); ok { + return returnFunc(ctx, in, opts...) + } + if returnFunc, ok := ret.Get(0).(func(context.Context, *apiclient.ChangeRevisionRequest, ...grpc.CallOption) *apiclient.ChangeRevisionResponse); ok { + r0 = returnFunc(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*apiclient.ChangeRevisionResponse) + } + } + if returnFunc, ok := ret.Get(1).(func(context.Context, *apiclient.ChangeRevisionRequest, ...grpc.CallOption) error); ok { + r1 = returnFunc(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + return r0, r1 +} + +// RepoServerServiceClient_GetChangeRevision_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetChangeRevision' +type RepoServerServiceClient_GetChangeRevision_Call struct { + *mock.Call +} + +// GetChangeRevision is a helper method to define mock.On call +// - ctx context.Context +// - in *apiclient.ChangeRevisionRequest +// - opts ...grpc.CallOption +func (_e *RepoServerServiceClient_Expecter) GetChangeRevision(ctx interface{}, in interface{}, opts ...interface{}) *RepoServerServiceClient_GetChangeRevision_Call { + return &RepoServerServiceClient_GetChangeRevision_Call{Call: _e.mock.On("GetChangeRevision", + append([]interface{}{ctx, in}, opts...)...)} +} + +func (_c *RepoServerServiceClient_GetChangeRevision_Call) Run(run func(ctx context.Context, in *apiclient.ChangeRevisionRequest, opts ...grpc.CallOption)) *RepoServerServiceClient_GetChangeRevision_Call { + _c.Call.Run(func(args mock.Arguments) { + var arg0 context.Context + if args[0] != nil { + arg0 = args[0].(context.Context) + } + var arg1 *apiclient.ChangeRevisionRequest + if args[1] != nil { + arg1 = args[1].(*apiclient.ChangeRevisionRequest) + } + var arg2 []grpc.CallOption + variadicArgs := make([]grpc.CallOption, len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(grpc.CallOption) + } + } + arg2 = variadicArgs + run( + arg0, + arg1, + arg2..., + ) + }) + return _c +} + +func (_c *RepoServerServiceClient_GetChangeRevision_Call) Return(changeRevisionResponse *apiclient.ChangeRevisionResponse, err error) *RepoServerServiceClient_GetChangeRevision_Call { + _c.Call.Return(changeRevisionResponse, err) + return _c +} + +func (_c *RepoServerServiceClient_GetChangeRevision_Call) RunAndReturn(run func(ctx context.Context, in *apiclient.ChangeRevisionRequest, opts ...grpc.CallOption) (*apiclient.ChangeRevisionResponse, error)) *RepoServerServiceClient_GetChangeRevision_Call { + _c.Call.Return(run) + return _c +} + // GetGitDirectories provides a mock function for the type RepoServerServiceClient func (_mock *RepoServerServiceClient) GetGitDirectories(ctx context.Context, in *apiclient.GitDirectoriesRequest, opts ...grpc.CallOption) (*apiclient.GitDirectoriesResponse, error) { // grpc.CallOption diff --git a/reposerver/apiclient/repository.pb.go b/reposerver/apiclient/repository.pb.go index a71e9fe6ef60a..d00834d573ae9 100644 --- a/reposerver/apiclient/repository.pb.go +++ b/reposerver/apiclient/repository.pb.go @@ -13,6 +13,8 @@ import ( status "google.golang.org/grpc/status" emptypb "google.golang.org/protobuf/types/known/emptypb" io "io" + _ "k8s.io/api/core/v1" + _ "k8s.io/apimachinery/pkg/apis/meta/v1" math "math" math_bits "math/bits" ) @@ -2428,6 +2430,140 @@ func (m *UpdateRevisionForPathsResponse) GetRevision() string { return "" } +type ChangeRevisionRequest struct { + AppName string `protobuf:"bytes,1,opt,name=appName,proto3" json:"appName,omitempty"` + Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` + CurrentRevision string `protobuf:"bytes,3,opt,name=currentRevision,proto3" json:"currentRevision,omitempty"` + PreviousRevision string `protobuf:"bytes,4,opt,name=previousRevision,proto3" json:"previousRevision,omitempty"` + Paths []string `protobuf:"bytes,5,rep,name=paths,proto3" json:"paths,omitempty"` + Repo *v1alpha1.Repository `protobuf:"bytes,6,opt,name=repo,proto3" json:"repo,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ChangeRevisionRequest) Reset() { *m = ChangeRevisionRequest{} } +func (m *ChangeRevisionRequest) String() string { return proto.CompactTextString(m) } +func (*ChangeRevisionRequest) ProtoMessage() {} +func (*ChangeRevisionRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_dd8723cfcc820480, []int{33} +} +func (m *ChangeRevisionRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ChangeRevisionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ChangeRevisionRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ChangeRevisionRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ChangeRevisionRequest.Merge(m, src) +} +func (m *ChangeRevisionRequest) XXX_Size() int { + return m.Size() +} +func (m *ChangeRevisionRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ChangeRevisionRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ChangeRevisionRequest proto.InternalMessageInfo + +func (m *ChangeRevisionRequest) GetAppName() string { + if m != nil { + return m.AppName + } + return "" +} + +func (m *ChangeRevisionRequest) GetNamespace() string { + if m != nil { + return m.Namespace + } + return "" +} + +func (m *ChangeRevisionRequest) GetCurrentRevision() string { + if m != nil { + return m.CurrentRevision + } + return "" +} + +func (m *ChangeRevisionRequest) GetPreviousRevision() string { + if m != nil { + return m.PreviousRevision + } + return "" +} + +func (m *ChangeRevisionRequest) GetPaths() []string { + if m != nil { + return m.Paths + } + return nil +} + +func (m *ChangeRevisionRequest) GetRepo() *v1alpha1.Repository { + if m != nil { + return m.Repo + } + return nil +} + +type ChangeRevisionResponse struct { + Revision string `protobuf:"bytes,1,opt,name=revision,proto3" json:"revision,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ChangeRevisionResponse) Reset() { *m = ChangeRevisionResponse{} } +func (m *ChangeRevisionResponse) String() string { return proto.CompactTextString(m) } +func (*ChangeRevisionResponse) ProtoMessage() {} +func (*ChangeRevisionResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_dd8723cfcc820480, []int{34} +} +func (m *ChangeRevisionResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ChangeRevisionResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ChangeRevisionResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ChangeRevisionResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ChangeRevisionResponse.Merge(m, src) +} +func (m *ChangeRevisionResponse) XXX_Size() int { + return m.Size() +} +func (m *ChangeRevisionResponse) XXX_DiscardUnknown() { + xxx_messageInfo_ChangeRevisionResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_ChangeRevisionResponse proto.InternalMessageInfo + +func (m *ChangeRevisionResponse) GetRevision() string { + if m != nil { + return m.Revision + } + return "" +} + func init() { proto.RegisterType((*ManifestRequest)(nil), "repository.ManifestRequest") proto.RegisterMapType((map[string]bool)(nil), "repository.ManifestRequest.EnabledSourceTypesEntry") @@ -2471,6 +2607,8 @@ func init() { proto.RegisterType((*UpdateRevisionForPathsRequest)(nil), "repository.UpdateRevisionForPathsRequest") proto.RegisterMapType((map[string]*v1alpha1.RefTarget)(nil), "repository.UpdateRevisionForPathsRequest.RefSourcesEntry") proto.RegisterType((*UpdateRevisionForPathsResponse)(nil), "repository.UpdateRevisionForPathsResponse") + proto.RegisterType((*ChangeRevisionRequest)(nil), "repository.ChangeRevisionRequest") + proto.RegisterType((*ChangeRevisionResponse)(nil), "repository.ChangeRevisionResponse") } func init() { @@ -2478,158 +2616,165 @@ func init() { } var fileDescriptor_dd8723cfcc820480 = []byte{ - // 2407 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x1a, 0xcb, 0x72, 0x1c, 0x49, - 0x71, 0x9e, 0xd2, 0x4c, 0xea, 0x5d, 0xb6, 0xe5, 0xf6, 0xd8, 0x16, 0xda, 0x06, 0x3b, 0xbc, 0xf6, - 0xee, 0x28, 0x6c, 0xc7, 0xae, 0xc1, 0xbb, 0x2c, 0xa1, 0x95, 0x6d, 0x49, 0x6b, 0xcb, 0x16, 0x6d, - 0xef, 0x12, 0x06, 0x03, 0x51, 0xd3, 0x53, 0xea, 0xe9, 0x55, 0x3f, 0xca, 0xdd, 0xd5, 0x5a, 0xe4, - 0x08, 0x2e, 0x40, 0x70, 0xe1, 0xc2, 0x69, 0x0f, 0x5c, 0xf9, 0x06, 0x82, 0x23, 0x27, 0x02, 0x8e, - 0x04, 0x17, 0x2e, 0x44, 0x40, 0xf8, 0x4b, 0x88, 0x7a, 0xf4, 0x73, 0x7a, 0x46, 0x5a, 0x8f, 0xad, - 0x05, 0x2e, 0x52, 0x57, 0x56, 0x56, 0x66, 0x56, 0x56, 0x66, 0x56, 0x66, 0xd6, 0xc0, 0xe5, 0x80, - 0x50, 0x3f, 0x24, 0xc1, 0x01, 0x09, 0xd6, 0xc4, 0xa7, 0xcd, 0xfc, 0xe0, 0x30, 0xf3, 0xd9, 0xa5, - 0x81, 0xcf, 0x7c, 0x04, 0x29, 0xa4, 0xf3, 0xc0, 0xb2, 0xd9, 0x20, 0xea, 0x75, 0x4d, 0xdf, 0x5d, - 0xc3, 0x81, 0xe5, 0xd3, 0xc0, 0xff, 0x5c, 0x7c, 0xbc, 0x6b, 0xf6, 0xd7, 0x0e, 0x6e, 0xae, 0xd1, - 0x7d, 0x6b, 0x0d, 0x53, 0x3b, 0x5c, 0xc3, 0x94, 0x3a, 0xb6, 0x89, 0x99, 0xed, 0x7b, 0x6b, 0x07, - 0xd7, 0xb1, 0x43, 0x07, 0xf8, 0xfa, 0x9a, 0x45, 0x3c, 0x12, 0x60, 0x46, 0xfa, 0x92, 0x72, 0xe7, - 0xbc, 0xe5, 0xfb, 0x96, 0x43, 0xd6, 0xc4, 0xa8, 0x17, 0xed, 0xad, 0x11, 0x97, 0x32, 0xc5, 0x56, - 0xff, 0xe7, 0x1c, 0x2c, 0xec, 0x60, 0xcf, 0xde, 0x23, 0x21, 0x33, 0xc8, 0xf3, 0x88, 0x84, 0x0c, - 0x3d, 0x83, 0x06, 0x17, 0x46, 0xab, 0xae, 0x56, 0xaf, 0xcc, 0xdc, 0xd8, 0xea, 0xa6, 0xd2, 0x74, - 0x63, 0x69, 0xc4, 0xc7, 0x4f, 0xcd, 0x7e, 0xf7, 0xe0, 0x66, 0x97, 0xee, 0x5b, 0x5d, 0x2e, 0x4d, - 0x37, 0x23, 0x4d, 0x37, 0x96, 0xa6, 0x6b, 0x24, 0xdb, 0x32, 0x04, 0x55, 0xd4, 0x81, 0x56, 0x40, - 0x0e, 0xec, 0xd0, 0xf6, 0x3d, 0xad, 0xb6, 0x5a, 0xbd, 0xd2, 0x36, 0x92, 0x31, 0xd2, 0x60, 0xda, - 0xf3, 0x37, 0xb0, 0x39, 0x20, 0x5a, 0x7d, 0xb5, 0x7a, 0xa5, 0x65, 0xc4, 0x43, 0xb4, 0x0a, 0x33, - 0x98, 0xd2, 0x07, 0xb8, 0x47, 0x9c, 0xfb, 0xe4, 0x50, 0x6b, 0x88, 0x85, 0x59, 0x10, 0x5f, 0x8b, - 0x29, 0x7d, 0x88, 0x5d, 0xa2, 0x35, 0xc5, 0x6c, 0x3c, 0x44, 0x17, 0xa0, 0xed, 0x61, 0x97, 0x84, - 0x14, 0x9b, 0x44, 0x6b, 0x89, 0xb9, 0x14, 0x80, 0x7e, 0x0e, 0x4b, 0x19, 0xc1, 0x1f, 0xfb, 0x51, - 0x60, 0x12, 0x0d, 0xc4, 0xd6, 0x1f, 0x4d, 0xb6, 0xf5, 0xf5, 0x22, 0x59, 0x63, 0x98, 0x13, 0xfa, - 0x09, 0x34, 0xc5, 0xc9, 0x6b, 0x33, 0xab, 0xf5, 0xd7, 0xaa, 0x6d, 0x49, 0x16, 0x79, 0x30, 0x4d, - 0x9d, 0xc8, 0xb2, 0xbd, 0x50, 0x9b, 0x15, 0x1c, 0x9e, 0x4c, 0xc6, 0x61, 0xc3, 0xf7, 0xf6, 0x6c, - 0x6b, 0x07, 0x7b, 0xd8, 0x22, 0x2e, 0xf1, 0xd8, 0xae, 0x20, 0x6e, 0xc4, 0x4c, 0xd0, 0x0b, 0x58, - 0xdc, 0x8f, 0x42, 0xe6, 0xbb, 0xf6, 0x0b, 0xf2, 0x88, 0xf2, 0xb5, 0xa1, 0x36, 0x27, 0xb4, 0xf9, - 0x70, 0x32, 0xc6, 0xf7, 0x0b, 0x54, 0x8d, 0x21, 0x3e, 0xdc, 0x48, 0xf6, 0xa3, 0x1e, 0xf9, 0x8c, - 0x04, 0xc2, 0xba, 0xe6, 0xa5, 0x91, 0x64, 0x40, 0xd2, 0x8c, 0x6c, 0x35, 0x0a, 0xb5, 0x85, 0xd5, - 0xba, 0x34, 0xa3, 0x04, 0x84, 0xae, 0xc0, 0xc2, 0x01, 0x09, 0xec, 0xbd, 0xc3, 0xc7, 0xb6, 0xe5, - 0x61, 0x16, 0x05, 0x44, 0x5b, 0x14, 0xa6, 0x58, 0x04, 0x23, 0x17, 0xe6, 0x06, 0xc4, 0x71, 0xb9, - 0xca, 0x37, 0x02, 0xd2, 0x0f, 0xb5, 0x25, 0xa1, 0xdf, 0xcd, 0xc9, 0x4f, 0x50, 0x90, 0x33, 0xf2, - 0xd4, 0xb9, 0x60, 0x9e, 0x6f, 0x28, 0x4f, 0x91, 0x3e, 0x82, 0xa4, 0x60, 0x05, 0x30, 0xba, 0x0c, - 0xf3, 0x2c, 0xc0, 0xe6, 0xbe, 0xed, 0x59, 0x3b, 0x84, 0x0d, 0xfc, 0xbe, 0x76, 0x4a, 0x68, 0xa2, - 0x00, 0x45, 0x26, 0x20, 0xe2, 0xe1, 0x9e, 0x43, 0xfa, 0xd2, 0x16, 0x9f, 0x1c, 0x52, 0x12, 0x6a, - 0xa7, 0xc5, 0x2e, 0x6e, 0x76, 0x33, 0x11, 0xaa, 0x10, 0x20, 0xba, 0x77, 0x87, 0x56, 0xdd, 0xf5, - 0x58, 0x70, 0x68, 0x94, 0x90, 0x43, 0xfb, 0x30, 0xc3, 0xf7, 0x11, 0x9b, 0xc2, 0x19, 0x61, 0x0a, - 0xdb, 0x93, 0xe9, 0x68, 0x2b, 0x25, 0x68, 0x64, 0xa9, 0xa3, 0x2e, 0xa0, 0x01, 0x0e, 0x77, 0x22, - 0x87, 0xd9, 0xd4, 0x21, 0x52, 0x8c, 0x50, 0x5b, 0x16, 0x6a, 0x2a, 0x99, 0x41, 0xf7, 0x01, 0x02, - 0xb2, 0x17, 0xe3, 0x9d, 0x15, 0x3b, 0xbf, 0x36, 0x6e, 0xe7, 0x46, 0x82, 0x2d, 0x77, 0x9c, 0x59, - 0xce, 0x99, 0xf3, 0x6d, 0x10, 0x93, 0x29, 0x6f, 0x17, 0x6e, 0xad, 0x09, 0x13, 0x2b, 0x99, 0xe1, - 0xb6, 0xa8, 0xa0, 0x22, 0x68, 0x9d, 0x93, 0xd6, 0x9a, 0x01, 0xa1, 0x2d, 0xf8, 0x06, 0xf6, 0x3c, - 0x9f, 0x89, 0xed, 0xc7, 0xa2, 0x6c, 0xaa, 0xf0, 0xbe, 0x8b, 0xd9, 0x20, 0xd4, 0x3a, 0x62, 0xd5, - 0x51, 0x68, 0xdc, 0x24, 0x6c, 0x2f, 0x64, 0xd8, 0x71, 0x04, 0xd2, 0xf6, 0x1d, 0xed, 0xbc, 0x34, - 0x89, 0x3c, 0xb4, 0x73, 0x17, 0xce, 0x8e, 0x38, 0x5c, 0xb4, 0x08, 0xf5, 0x7d, 0x72, 0x28, 0x2e, - 0x85, 0xb6, 0xc1, 0x3f, 0xd1, 0x69, 0x68, 0x1e, 0x60, 0x27, 0x22, 0x22, 0x8c, 0xb7, 0x0c, 0x39, - 0xb8, 0x5d, 0xfb, 0x76, 0xb5, 0xf3, 0xeb, 0x2a, 0x2c, 0x14, 0x54, 0x55, 0xb2, 0xfe, 0xc7, 0xd9, - 0xf5, 0xaf, 0xc1, 0x71, 0xf6, 0x9e, 0xe0, 0xc0, 0x22, 0x2c, 0x23, 0x88, 0xfe, 0xf7, 0x2a, 0x68, - 0x85, 0x33, 0xfc, 0x81, 0xcd, 0x06, 0xf7, 0x6c, 0x87, 0x84, 0xe8, 0x16, 0x4c, 0x07, 0x12, 0xa6, - 0xae, 0xba, 0xf3, 0x63, 0x8e, 0x7e, 0xab, 0x62, 0xc4, 0xd8, 0xe8, 0x23, 0x68, 0xb9, 0x84, 0xe1, - 0x3e, 0x66, 0x58, 0xc9, 0xbe, 0x5a, 0xb6, 0x92, 0x73, 0xd9, 0x51, 0x78, 0x5b, 0x15, 0x23, 0x59, - 0x83, 0xde, 0x83, 0xa6, 0x39, 0x88, 0xbc, 0x7d, 0x71, 0xc9, 0xcd, 0xdc, 0xb8, 0x38, 0x6a, 0xf1, - 0x06, 0x47, 0xda, 0xaa, 0x18, 0x12, 0xfb, 0xe3, 0x29, 0x68, 0x50, 0x1c, 0x30, 0xfd, 0x1e, 0x9c, - 0x2e, 0x63, 0xc1, 0x6f, 0x56, 0x73, 0x40, 0xcc, 0xfd, 0x30, 0x72, 0x95, 0x9a, 0x93, 0x31, 0x42, - 0xd0, 0x08, 0xed, 0x17, 0x52, 0xd5, 0x75, 0x43, 0x7c, 0xeb, 0x6f, 0xc3, 0xd2, 0x10, 0x37, 0x7e, - 0xa8, 0x52, 0x36, 0x4e, 0x61, 0x56, 0xb1, 0xd6, 0x23, 0x38, 0xf3, 0x44, 0xe8, 0x22, 0xb9, 0x5e, - 0x4e, 0x22, 0x57, 0xd0, 0xb7, 0x60, 0xb9, 0xc8, 0x36, 0xa4, 0xbe, 0x17, 0x12, 0xee, 0x6c, 0x22, - 0x1e, 0xdb, 0xa4, 0x9f, 0xce, 0x0a, 0x29, 0x5a, 0x46, 0xc9, 0x8c, 0xfe, 0xfb, 0x1a, 0x2c, 0x1b, - 0x24, 0xf4, 0x9d, 0x03, 0x12, 0x07, 0xcb, 0x93, 0x49, 0x77, 0x7e, 0x04, 0x75, 0x4c, 0xa9, 0x32, - 0x93, 0xed, 0xd7, 0x96, 0x50, 0x18, 0x9c, 0x2a, 0x7a, 0x07, 0x96, 0xb0, 0xdb, 0xb3, 0xad, 0xc8, - 0x8f, 0xc2, 0x78, 0x5b, 0xc2, 0xa8, 0xda, 0xc6, 0xf0, 0x04, 0x0f, 0x38, 0xa1, 0xf0, 0xc8, 0x6d, - 0xaf, 0x4f, 0x7e, 0x26, 0x72, 0xa8, 0xba, 0x91, 0x05, 0xe9, 0x26, 0x9c, 0x1d, 0x52, 0x92, 0x52, - 0x78, 0x36, 0x6d, 0xab, 0x16, 0xd2, 0xb6, 0x52, 0x31, 0x6a, 0x23, 0xc4, 0xd0, 0x5f, 0x56, 0x61, - 0x31, 0x75, 0x2e, 0x45, 0xfe, 0x02, 0xb4, 0x5d, 0x05, 0x0b, 0xb5, 0xaa, 0x88, 0x99, 0x29, 0x20, - 0x9f, 0xc1, 0xd5, 0x8a, 0x19, 0xdc, 0x32, 0x4c, 0xc9, 0x04, 0x5b, 0x6d, 0x5d, 0x8d, 0x72, 0x22, - 0x37, 0x0a, 0x22, 0xaf, 0x00, 0x84, 0x49, 0x84, 0xd3, 0xa6, 0xc4, 0x6c, 0x06, 0x82, 0x74, 0x98, - 0x95, 0xf7, 0xbd, 0x41, 0xc2, 0xc8, 0x61, 0xda, 0xb4, 0xc0, 0xc8, 0xc1, 0x84, 0xbf, 0xf9, 0xae, - 0x8b, 0xbd, 0x7e, 0xa8, 0xb5, 0x84, 0xc8, 0xc9, 0x58, 0xf7, 0x61, 0xe1, 0x81, 0xcd, 0xf7, 0xb7, - 0x17, 0x9e, 0x8c, 0xab, 0xbc, 0x0f, 0x0d, 0xce, 0x8c, 0x0b, 0xd5, 0x0b, 0xb0, 0x67, 0x0e, 0x48, - 0xac, 0xc7, 0x64, 0xcc, 0x83, 0x00, 0xc3, 0x56, 0xa8, 0xd5, 0x04, 0x5c, 0x7c, 0xeb, 0x7f, 0xac, - 0x49, 0x49, 0xd7, 0x29, 0x0d, 0xbf, 0xfe, 0x02, 0xa0, 0x3c, 0x25, 0xa9, 0x0f, 0xa7, 0x24, 0x05, - 0x91, 0xbf, 0x4a, 0x4a, 0xf2, 0x9a, 0x2e, 0x39, 0x3d, 0x82, 0xe9, 0x75, 0x4a, 0xb9, 0x20, 0xe8, - 0x3a, 0x34, 0x30, 0xa5, 0x52, 0xe1, 0x85, 0x78, 0xae, 0x50, 0xf8, 0x7f, 0x25, 0x92, 0x40, 0xed, - 0xdc, 0x82, 0x76, 0x02, 0x3a, 0x8a, 0x6d, 0x3b, 0xcb, 0x76, 0x15, 0x40, 0xe6, 0xdc, 0xdb, 0xde, - 0x9e, 0xcf, 0x8f, 0x94, 0x3b, 0x82, 0x5a, 0x2a, 0xbe, 0xf5, 0xdb, 0x31, 0x86, 0x90, 0xed, 0x1d, - 0x68, 0xda, 0x8c, 0xb8, 0xb1, 0x70, 0xcb, 0x59, 0xe1, 0x52, 0x42, 0x86, 0x44, 0xd2, 0xff, 0xd2, - 0x82, 0x73, 0xfc, 0xc4, 0x1e, 0x0b, 0x17, 0x5a, 0xa7, 0xf4, 0x0e, 0x61, 0xd8, 0x76, 0xc2, 0xef, - 0x47, 0x24, 0x38, 0x7c, 0xc3, 0x86, 0x61, 0xc1, 0x94, 0xf4, 0x40, 0x15, 0x2d, 0x5f, 0x7b, 0xf9, - 0xa5, 0xc8, 0xa7, 0x35, 0x57, 0xfd, 0xcd, 0xd4, 0x5c, 0x65, 0x35, 0x50, 0xe3, 0x84, 0x6a, 0xa0, - 0xd1, 0x65, 0x70, 0xa6, 0xb8, 0x9e, 0xca, 0x17, 0xd7, 0x25, 0xa5, 0xc5, 0xf4, 0x71, 0x4b, 0x8b, - 0x56, 0x69, 0x69, 0xe1, 0x96, 0xfa, 0x71, 0x5b, 0xa8, 0xfb, 0xbb, 0x59, 0x0b, 0x1c, 0x69, 0x6b, - 0x93, 0x14, 0x19, 0xf0, 0x46, 0x8b, 0x8c, 0x4f, 0x73, 0x45, 0x83, 0x2c, 0xdb, 0xdf, 0x3b, 0xde, - 0x9e, 0xc6, 0x94, 0x0f, 0xff, 0x77, 0xa9, 0xf7, 0xaf, 0x44, 0xc6, 0x45, 0xfd, 0x54, 0x07, 0xc9, - 0x65, 0xcf, 0xef, 0x21, 0x7e, 0xed, 0xaa, 0xa0, 0xc5, 0xbf, 0xd1, 0x35, 0x68, 0x70, 0x25, 0xab, - 0x94, 0xf8, 0x6c, 0x56, 0x9f, 0xfc, 0x24, 0xd6, 0x29, 0x7d, 0x4c, 0x89, 0x69, 0x08, 0x24, 0x74, - 0x1b, 0xda, 0x89, 0xe1, 0x2b, 0xcf, 0xba, 0x90, 0x5d, 0x91, 0xf8, 0x49, 0xbc, 0x2c, 0x45, 0xe7, - 0x6b, 0xfb, 0x76, 0x40, 0x4c, 0x91, 0x30, 0x36, 0x87, 0xd7, 0xde, 0x89, 0x27, 0x93, 0xb5, 0x09, - 0x3a, 0xba, 0x0e, 0x53, 0xb2, 0xcf, 0x21, 0x3c, 0x68, 0xe6, 0xc6, 0xb9, 0xe1, 0x60, 0x1a, 0xaf, - 0x52, 0x88, 0xfa, 0x9f, 0xab, 0xf0, 0x56, 0x6a, 0x10, 0xb1, 0x37, 0xc5, 0x39, 0xfb, 0xd7, 0x7f, - 0xe3, 0x5e, 0x86, 0x79, 0x51, 0x24, 0xa4, 0xed, 0x0e, 0xd9, 0x79, 0x2b, 0x40, 0xf5, 0x3f, 0x54, - 0xe1, 0xd2, 0xf0, 0x3e, 0x36, 0x06, 0x38, 0x60, 0xc9, 0xf1, 0x9e, 0xc4, 0x5e, 0xe2, 0x0b, 0xaf, - 0x96, 0x5e, 0x78, 0xb9, 0xfd, 0xd5, 0xf3, 0xfb, 0xd3, 0xff, 0x54, 0x83, 0x99, 0x8c, 0x01, 0x95, - 0x5d, 0x98, 0x3c, 0x19, 0x14, 0x76, 0x2b, 0xca, 0x42, 0x71, 0x29, 0xb4, 0x8d, 0x0c, 0x04, 0xed, - 0x03, 0x50, 0x1c, 0x60, 0x97, 0x30, 0x12, 0xf0, 0x48, 0xce, 0x3d, 0xfe, 0xfe, 0xe4, 0xd1, 0x65, - 0x37, 0xa6, 0x69, 0x64, 0xc8, 0xf3, 0x6c, 0x56, 0xb0, 0x0e, 0x55, 0xfc, 0x56, 0x23, 0xf4, 0x05, - 0xcc, 0xef, 0xd9, 0x0e, 0xd9, 0x4d, 0x05, 0x99, 0x12, 0x82, 0x3c, 0x9a, 0x5c, 0x90, 0x7b, 0x59, - 0xba, 0x46, 0x81, 0x8d, 0x7e, 0x15, 0x16, 0x8b, 0xfe, 0xc4, 0x85, 0xb4, 0x5d, 0x6c, 0x25, 0xda, - 0x52, 0x23, 0x1d, 0xc1, 0x62, 0xd1, 0x7f, 0xf4, 0x7f, 0xd5, 0xe0, 0x4c, 0x42, 0x6e, 0xdd, 0xf3, - 0xfc, 0xc8, 0x33, 0x45, 0xeb, 0xb0, 0xf4, 0x2c, 0x4e, 0x43, 0x93, 0xd9, 0xcc, 0x49, 0x12, 0x1f, - 0x31, 0xe0, 0x77, 0x17, 0xf3, 0x7d, 0x87, 0xd9, 0x54, 0x1d, 0x70, 0x3c, 0x94, 0x67, 0xff, 0x3c, - 0xb2, 0x03, 0xd2, 0x17, 0x91, 0xa0, 0x65, 0x24, 0x63, 0x3e, 0xc7, 0xb3, 0x1a, 0x91, 0xe2, 0x4b, - 0x65, 0x26, 0x63, 0x61, 0xf7, 0xbe, 0xe3, 0x10, 0x93, 0xab, 0x23, 0x53, 0x04, 0x14, 0xa0, 0xa2, - 0xb8, 0x60, 0x81, 0xed, 0x59, 0xaa, 0x04, 0x50, 0x23, 0x2e, 0x27, 0x0e, 0x02, 0x7c, 0xa8, 0x32, - 0x7f, 0x39, 0x40, 0x1f, 0x42, 0xdd, 0xc5, 0x54, 0x5d, 0x74, 0x57, 0x73, 0xd1, 0xa1, 0x4c, 0x03, - 0xdd, 0x1d, 0x4c, 0xe5, 0x4d, 0xc0, 0x97, 0x75, 0xde, 0x87, 0x56, 0x0c, 0xf8, 0x4a, 0x29, 0xe1, - 0xe7, 0x30, 0x97, 0x0b, 0x3e, 0xe8, 0x29, 0x2c, 0xa7, 0x16, 0x95, 0x65, 0xa8, 0x92, 0xc0, 0xb7, - 0x8e, 0x94, 0xcc, 0x18, 0x41, 0x40, 0x7f, 0x0e, 0x4b, 0xdc, 0x64, 0x84, 0xe3, 0x9f, 0x50, 0x69, - 0xf3, 0x01, 0xb4, 0x13, 0x96, 0xa5, 0x36, 0xd3, 0x81, 0xd6, 0x41, 0xdc, 0xd2, 0x95, 0xb5, 0x4d, - 0x32, 0xd6, 0xd7, 0x01, 0x65, 0xe5, 0x55, 0x37, 0xd0, 0xb5, 0x7c, 0x52, 0x7c, 0xa6, 0x78, 0xdd, - 0x08, 0xf4, 0x38, 0x27, 0xfe, 0x47, 0x0d, 0x16, 0x36, 0x6d, 0xd1, 0x23, 0x39, 0xa1, 0x20, 0x77, - 0x15, 0x16, 0xc3, 0xa8, 0xe7, 0xfa, 0xfd, 0xc8, 0x21, 0x2a, 0x29, 0x50, 0x37, 0xfd, 0x10, 0x7c, - 0x5c, 0xf0, 0xe3, 0xca, 0xa2, 0x98, 0x0d, 0x54, 0xf5, 0x2b, 0xbe, 0xd1, 0x87, 0x70, 0xee, 0x21, - 0xf9, 0x42, 0xed, 0x67, 0xd3, 0xf1, 0x7b, 0x3d, 0xdb, 0xb3, 0x62, 0x26, 0x4d, 0xc1, 0x64, 0x34, - 0x42, 0x59, 0xaa, 0x38, 0x55, 0x9e, 0x2a, 0x26, 0x15, 0xf4, 0x86, 0xef, 0xba, 0x36, 0x53, 0x19, - 0x65, 0x0e, 0xa6, 0xff, 0xb2, 0x0a, 0x8b, 0xa9, 0x66, 0xd5, 0xd9, 0xdc, 0x92, 0x3e, 0x24, 0x4f, - 0xe6, 0x52, 0xf6, 0x64, 0x8a, 0xa8, 0xaf, 0xee, 0x3e, 0xb3, 0x59, 0xf7, 0xf9, 0x4d, 0x0d, 0xce, - 0x6c, 0xda, 0x2c, 0x0e, 0x5c, 0xf6, 0xff, 0xda, 0x29, 0x97, 0x9c, 0x49, 0xe3, 0x78, 0x67, 0xd2, - 0x2c, 0x39, 0x93, 0x2e, 0x2c, 0x17, 0x95, 0xa1, 0x0e, 0xe6, 0x34, 0x34, 0xa9, 0x68, 0x3a, 0xcb, - 0xbe, 0x82, 0x1c, 0xe8, 0xbf, 0x98, 0x86, 0x8b, 0x9f, 0xd2, 0x3e, 0x66, 0x49, 0xcf, 0xe8, 0x9e, - 0x1f, 0x88, 0xae, 0xf3, 0xc9, 0x68, 0xb1, 0xf0, 0x32, 0x58, 0x1b, 0xfb, 0x32, 0x58, 0x1f, 0xf3, - 0x32, 0xd8, 0x38, 0xd6, 0xcb, 0x60, 0xf3, 0xc4, 0x5e, 0x06, 0x87, 0x6b, 0xad, 0xa9, 0xd2, 0x5a, - 0xeb, 0x69, 0xae, 0x1e, 0x99, 0x16, 0x6e, 0xf3, 0x9d, 0xac, 0xdb, 0x8c, 0x3d, 0x9d, 0xb1, 0x4f, - 0x1a, 0x85, 0x07, 0xb5, 0xd6, 0x91, 0x0f, 0x6a, 0xed, 0xe1, 0x07, 0xb5, 0xf2, 0x37, 0x19, 0x18, - 0xf9, 0x26, 0x73, 0x19, 0xe6, 0xc3, 0x43, 0xcf, 0x24, 0xfd, 0xa4, 0x93, 0x38, 0x23, 0xb7, 0x9d, - 0x87, 0xe6, 0x3c, 0x62, 0xb6, 0xe0, 0x11, 0x89, 0xa5, 0xce, 0x65, 0x2c, 0xb5, 0xcc, 0x4f, 0xe6, - 0x47, 0x96, 0xb9, 0x85, 0xe7, 0x92, 0x85, 0xd2, 0xe7, 0x92, 0xff, 0x9a, 0x62, 0xeb, 0x33, 0x58, - 0x19, 0x75, 0xca, 0xca, 0x79, 0x35, 0x98, 0x36, 0x07, 0xd8, 0xb3, 0x44, 0x5b, 0x50, 0x54, 0xff, - 0x6a, 0x38, 0xae, 0x3a, 0xb8, 0xf1, 0xe5, 0x2c, 0x2c, 0xa5, 0x59, 0x3f, 0xff, 0x6b, 0x9b, 0x04, - 0x3d, 0x82, 0xc5, 0xf8, 0x79, 0x29, 0x6e, 0xe4, 0xa2, 0x71, 0x6f, 0x27, 0x9d, 0x0b, 0xe5, 0x93, - 0x52, 0x34, 0xbd, 0x82, 0x4c, 0x38, 0x57, 0x24, 0x98, 0x3e, 0xd3, 0x7c, 0x6b, 0x0c, 0xe5, 0x04, - 0xeb, 0x28, 0x16, 0x57, 0xaa, 0xe8, 0x29, 0xcc, 0xe7, 0x1f, 0x13, 0x50, 0x2e, 0x0d, 0x2a, 0x7d, - 0xdf, 0xe8, 0xe8, 0xe3, 0x50, 0x12, 0xf9, 0x9f, 0x71, 0x33, 0xc8, 0xf5, 0xcd, 0x91, 0x9e, 0xef, - 0x08, 0x94, 0xbd, 0x3c, 0x74, 0xbe, 0x39, 0x16, 0x27, 0xa1, 0xfe, 0x01, 0xb4, 0xe2, 0x5e, 0x72, - 0x5e, 0xcd, 0x85, 0x0e, 0x73, 0x67, 0x31, 0x4f, 0x6f, 0x2f, 0xd4, 0x2b, 0xe8, 0x23, 0x98, 0xe1, - 0x68, 0x8f, 0x36, 0xb6, 0x9f, 0x60, 0xeb, 0x95, 0xd6, 0xb7, 0xe2, 0x5e, 0xeb, 0xf0, 0xe2, 0x4c, - 0x07, 0xb6, 0x73, 0xaa, 0xa4, 0xeb, 0xa9, 0x57, 0xd0, 0xf7, 0x24, 0xff, 0x5d, 0xf5, 0xf3, 0x80, - 0xe5, 0xae, 0xfc, 0x35, 0x4a, 0x37, 0xfe, 0x35, 0x4a, 0xf7, 0xae, 0x4b, 0xd9, 0x61, 0xa7, 0xa4, - 0x2d, 0xa9, 0x08, 0x3c, 0x83, 0xb9, 0x4d, 0xc2, 0xd2, 0x2e, 0x02, 0xba, 0x74, 0xac, 0x5e, 0x4b, - 0x47, 0x2f, 0xa2, 0x0d, 0x37, 0x22, 0xf4, 0x0a, 0xfa, 0xb2, 0x0a, 0xa7, 0x36, 0x09, 0x2b, 0xd6, - 0xe5, 0xe8, 0xdd, 0x72, 0x26, 0x23, 0xea, 0xf7, 0xce, 0xc3, 0x49, 0x7d, 0x3a, 0x4f, 0x56, 0xaf, - 0xa0, 0xdf, 0x56, 0x61, 0x7e, 0x93, 0xf0, 0x73, 0x4b, 0x64, 0xba, 0x3e, 0x5e, 0xa6, 0x92, 0x5a, - 0xbc, 0x33, 0x61, 0x0f, 0x2c, 0xc3, 0x5d, 0xaf, 0xa0, 0xdf, 0x55, 0xe1, 0x6c, 0x46, 0x57, 0x59, - 0x7e, 0xaf, 0x22, 0xdb, 0x27, 0x13, 0xfe, 0x10, 0x25, 0x43, 0x52, 0xaf, 0xa0, 0x5d, 0x61, 0x26, - 0x69, 0xaa, 0x8f, 0x2e, 0x96, 0xe6, 0xf4, 0x09, 0xf7, 0x95, 0x51, 0xd3, 0x89, 0x69, 0x7c, 0x02, - 0x33, 0x9b, 0x84, 0xc5, 0x39, 0x67, 0xde, 0xf8, 0x0b, 0xe5, 0x40, 0x3e, 0xfa, 0x14, 0xd3, 0x54, - 0x61, 0xc4, 0x4b, 0x92, 0x56, 0x26, 0xaf, 0xca, 0x87, 0x9f, 0xd2, 0x04, 0x34, 0x6f, 0xc4, 0xe5, - 0x69, 0x99, 0x5e, 0x41, 0xcf, 0x61, 0xb9, 0x3c, 0xfa, 0xa3, 0xb7, 0x8f, 0x9d, 0x07, 0x74, 0xae, - 0x1e, 0x07, 0x35, 0x66, 0xf9, 0xf1, 0xfa, 0x5f, 0x5f, 0xae, 0x54, 0xff, 0xf6, 0x72, 0xa5, 0xfa, - 0xef, 0x97, 0x2b, 0xd5, 0x1f, 0xde, 0x3c, 0xe2, 0x07, 0x6b, 0x99, 0xdf, 0xc0, 0x61, 0x6a, 0x9b, - 0x8e, 0x4d, 0x3c, 0xd6, 0x9b, 0x12, 0x21, 0xe0, 0xe6, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0xc9, - 0x9b, 0xb9, 0x62, 0x22, 0x27, 0x00, 0x00, + // 2520 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x1a, 0x5d, 0x73, 0x1c, 0x47, + 0xf1, 0xbe, 0x75, 0xd7, 0xfa, 0x1e, 0x5b, 0xf2, 0xfa, 0x6c, 0x0b, 0x65, 0xc1, 0x2e, 0xc5, 0x4e, + 0xee, 0xca, 0x76, 0x12, 0x07, 0x27, 0x84, 0x52, 0x64, 0x5b, 0x52, 0x6c, 0xd9, 0x62, 0xed, 0x84, + 0x32, 0x18, 0xa8, 0xb9, 0xbd, 0xd1, 0xdd, 0xe6, 0xf6, 0x63, 0xbc, 0x3b, 0xab, 0x70, 0xae, 0xe2, + 0x05, 0x28, 0x5e, 0x78, 0xe1, 0x89, 0x2a, 0x78, 0xe5, 0x37, 0x50, 0x3c, 0xf2, 0x44, 0xc1, 0x23, + 0xc5, 0x0b, 0x2f, 0x54, 0x41, 0xf9, 0x37, 0xf0, 0x03, 0xa8, 0x99, 0x9d, 0xfd, 0xbc, 0xbd, 0x93, + 0xe2, 0x93, 0x15, 0xe0, 0x45, 0xda, 0xe9, 0xe9, 0xe9, 0xee, 0xe9, 0xe9, 0xee, 0xe9, 0xee, 0x39, + 0xb8, 0xe2, 0x12, 0xea, 0x78, 0xc4, 0x3d, 0x24, 0x6e, 0x5b, 0x7c, 0x1a, 0xcc, 0x71, 0x87, 0x89, + 0xcf, 0x16, 0x75, 0x1d, 0xe6, 0x20, 0x88, 0x21, 0x4d, 0x75, 0xf0, 0xbe, 0xd7, 0x32, 0x9c, 0x36, + 0xa6, 0x46, 0x5b, 0x77, 0x5c, 0xd2, 0x3e, 0xbc, 0xde, 0xee, 0x11, 0x9b, 0xb8, 0x98, 0x91, 0x6e, + 0x80, 0xdf, 0x7c, 0x27, 0xc6, 0xb1, 0xb0, 0xde, 0x37, 0x6c, 0xe2, 0x0e, 0xdb, 0x74, 0xd0, 0xe3, + 0x00, 0xaf, 0x6d, 0x11, 0x86, 0xf3, 0x56, 0x3d, 0xe8, 0x19, 0xac, 0xef, 0x77, 0x5a, 0xba, 0x63, + 0xb5, 0xb1, 0xdb, 0x73, 0xa8, 0xeb, 0x7c, 0x2e, 0x3e, 0xde, 0xd6, 0xbb, 0xed, 0xc3, 0x9b, 0x31, + 0x01, 0x4c, 0xa9, 0x69, 0xe8, 0x98, 0x19, 0x8e, 0xdd, 0x3e, 0xbc, 0x8e, 0x4d, 0xda, 0xc7, 0xa3, + 0xd4, 0x2e, 0xf4, 0x1c, 0xa7, 0x67, 0x92, 0xb6, 0x18, 0x75, 0xfc, 0x83, 0x36, 0xb1, 0x28, 0x93, + 0x1b, 0x52, 0xff, 0x31, 0x0f, 0x8b, 0x7b, 0xd8, 0x36, 0x0e, 0x88, 0xc7, 0x34, 0xf2, 0xdc, 0x27, + 0x1e, 0x43, 0xcf, 0xa0, 0xc2, 0xb7, 0xa9, 0x14, 0xd7, 0x8b, 0x1b, 0xb3, 0x37, 0x76, 0x5a, 0xb1, + 0x34, 0xad, 0x50, 0x1a, 0xf1, 0xf1, 0x23, 0xbd, 0xdb, 0x3a, 0xbc, 0xd9, 0xa2, 0x83, 0x5e, 0x8b, + 0x4b, 0xd3, 0x4a, 0x48, 0xd3, 0x0a, 0xa5, 0x69, 0x69, 0x91, 0xc2, 0x34, 0x41, 0x15, 0x35, 0xa1, + 0xee, 0x92, 0x43, 0xc3, 0x33, 0x1c, 0x5b, 0x29, 0xad, 0x17, 0x37, 0x1a, 0x5a, 0x34, 0x46, 0x0a, + 0xcc, 0xd8, 0xce, 0x16, 0xd6, 0xfb, 0x44, 0x29, 0xaf, 0x17, 0x37, 0xea, 0x5a, 0x38, 0x44, 0xeb, + 0x30, 0x8b, 0x29, 0x7d, 0x80, 0x3b, 0xc4, 0xbc, 0x4f, 0x86, 0x4a, 0x45, 0x2c, 0x4c, 0x82, 0xf8, + 0x5a, 0x4c, 0xe9, 0x43, 0x6c, 0x11, 0xa5, 0x2a, 0x66, 0xc3, 0x21, 0xba, 0x08, 0x0d, 0x1b, 0x5b, + 0xc4, 0xa3, 0x58, 0x27, 0x4a, 0x5d, 0xcc, 0xc5, 0x00, 0xf4, 0x13, 0x58, 0x4e, 0x08, 0xfe, 0xd8, + 0xf1, 0x5d, 0x9d, 0x28, 0x20, 0xb6, 0xfe, 0x68, 0xba, 0xad, 0x6f, 0x66, 0xc9, 0x6a, 0xa3, 0x9c, + 0xd0, 0x0f, 0xa1, 0x2a, 0x6c, 0x4a, 0x99, 0x5d, 0x2f, 0x9f, 0xa8, 0xb6, 0x03, 0xb2, 0xc8, 0x86, + 0x19, 0x6a, 0xfa, 0x3d, 0xc3, 0xf6, 0x94, 0x39, 0xc1, 0xe1, 0xc9, 0x74, 0x1c, 0xb6, 0x1c, 0xfb, + 0xc0, 0xe8, 0xed, 0x61, 0x1b, 0xf7, 0x88, 0x45, 0x6c, 0xb6, 0x2f, 0x88, 0x6b, 0x21, 0x13, 0xf4, + 0x02, 0x96, 0x06, 0xbe, 0xc7, 0x1c, 0xcb, 0x78, 0x41, 0x1e, 0x51, 0xbe, 0xd6, 0x53, 0xe6, 0x85, + 0x36, 0x1f, 0x4e, 0xc7, 0xf8, 0x7e, 0x86, 0xaa, 0x36, 0xc2, 0x87, 0x1b, 0xc9, 0xc0, 0xef, 0x90, + 0xcf, 0x88, 0x2b, 0xac, 0x6b, 0x21, 0x30, 0x92, 0x04, 0x28, 0x30, 0x23, 0x43, 0x8e, 0x3c, 0x65, + 0x71, 0xbd, 0x1c, 0x98, 0x51, 0x04, 0x42, 0x1b, 0xb0, 0x78, 0x48, 0x5c, 0xe3, 0x60, 0xf8, 0xd8, + 0xe8, 0xd9, 0x98, 0xf9, 0x2e, 0x51, 0x96, 0x84, 0x29, 0x66, 0xc1, 0xc8, 0x82, 0xf9, 0x3e, 0x31, + 0x2d, 0xae, 0xf2, 0x2d, 0x97, 0x74, 0x3d, 0x65, 0x59, 0xe8, 0x77, 0x7b, 0xfa, 0x13, 0x14, 0xe4, + 0xb4, 0x34, 0x75, 0x2e, 0x98, 0xed, 0x68, 0xd2, 0x53, 0x02, 0x1f, 0x41, 0x81, 0x60, 0x19, 0x30, + 0xba, 0x02, 0x0b, 0xcc, 0xc5, 0xfa, 0xc0, 0xb0, 0x7b, 0x7b, 0x84, 0xf5, 0x9d, 0xae, 0x72, 0x46, + 0x68, 0x22, 0x03, 0x45, 0x3a, 0x20, 0x62, 0xe3, 0x8e, 0x49, 0xba, 0x81, 0x2d, 0x3e, 0x19, 0x52, + 0xe2, 0x29, 0x67, 0xc5, 0x2e, 0x6e, 0xb6, 0x12, 0xb1, 0x2f, 0x13, 0x20, 0x5a, 0x77, 0x47, 0x56, + 0xdd, 0xb5, 0x99, 0x3b, 0xd4, 0x72, 0xc8, 0xa1, 0x01, 0xcc, 0xf2, 0x7d, 0x84, 0xa6, 0xb0, 0x22, + 0x4c, 0x61, 0x77, 0x3a, 0x1d, 0xed, 0xc4, 0x04, 0xb5, 0x24, 0x75, 0xd4, 0x02, 0xd4, 0xc7, 0xde, + 0x9e, 0x6f, 0x32, 0x83, 0x9a, 0x24, 0x10, 0xc3, 0x53, 0x56, 0x85, 0x9a, 0x72, 0x66, 0xd0, 0x7d, + 0x00, 0x97, 0x1c, 0x84, 0x78, 0xe7, 0xc4, 0xce, 0xaf, 0x4d, 0xda, 0xb9, 0x16, 0x61, 0x07, 0x3b, + 0x4e, 0x2c, 0xe7, 0xcc, 0xf9, 0x36, 0x88, 0xce, 0xa4, 0xb7, 0x0b, 0xb7, 0x56, 0x84, 0x89, 0xe5, + 0xcc, 0x70, 0x5b, 0x94, 0x50, 0x11, 0xb4, 0xce, 0x07, 0xd6, 0x9a, 0x00, 0xa1, 0x1d, 0xf8, 0x1a, + 0xb6, 0x6d, 0x87, 0x89, 0xed, 0x87, 0xa2, 0x6c, 0xcb, 0xf0, 0xbe, 0x8f, 0x59, 0xdf, 0x53, 0x9a, + 0x62, 0xd5, 0x51, 0x68, 0xdc, 0x24, 0x0c, 0xdb, 0x63, 0xd8, 0x34, 0x05, 0xd2, 0xee, 0x1d, 0xe5, + 0x42, 0x60, 0x12, 0x69, 0x68, 0xf3, 0x2e, 0x9c, 0x1b, 0x73, 0xb8, 0x68, 0x09, 0xca, 0x03, 0x32, + 0x14, 0x97, 0x42, 0x43, 0xe3, 0x9f, 0xe8, 0x2c, 0x54, 0x0f, 0xb1, 0xe9, 0x13, 0x11, 0xc6, 0xeb, + 0x5a, 0x30, 0xb8, 0x5d, 0x7a, 0xbf, 0xd8, 0xfc, 0x45, 0x11, 0x16, 0x33, 0xaa, 0xca, 0x59, 0xff, + 0x83, 0xe4, 0xfa, 0x13, 0x70, 0x9c, 0x83, 0x27, 0xd8, 0xed, 0x11, 0x96, 0x10, 0x44, 0xfd, 0x5b, + 0x11, 0x94, 0xcc, 0x19, 0x7e, 0xd7, 0x60, 0xfd, 0x7b, 0x86, 0x49, 0x3c, 0x74, 0x0b, 0x66, 0xdc, + 0x00, 0x26, 0xaf, 0xba, 0x0b, 0x13, 0x8e, 0x7e, 0xa7, 0xa0, 0x85, 0xd8, 0xe8, 0x23, 0xa8, 0xf3, + 0xab, 0xbb, 0x8b, 0x19, 0x96, 0xb2, 0xaf, 0xe7, 0xad, 0xe4, 0x5c, 0xf6, 0x24, 0xde, 0x4e, 0x41, + 0x8b, 0xd6, 0xa0, 0x77, 0xa1, 0xaa, 0xf7, 0x7d, 0x7b, 0x20, 0x2e, 0xb9, 0xd9, 0x1b, 0x97, 0xc6, + 0x2d, 0xde, 0xe2, 0x48, 0x3b, 0x05, 0x2d, 0xc0, 0xfe, 0xb8, 0x06, 0x15, 0x8a, 0x5d, 0xa6, 0xde, + 0x83, 0xb3, 0x79, 0x2c, 0xf8, 0xcd, 0xaa, 0xf7, 0x89, 0x3e, 0xf0, 0x7c, 0x4b, 0xaa, 0x39, 0x1a, + 0x23, 0x04, 0x15, 0xcf, 0x78, 0x11, 0xa8, 0xba, 0xac, 0x89, 0x6f, 0xf5, 0x4d, 0x58, 0x1e, 0xe1, + 0xc6, 0x0f, 0x35, 0x90, 0x8d, 0x53, 0x98, 0x93, 0xac, 0x55, 0x1f, 0x56, 0x9e, 0x08, 0x5d, 0x44, + 0xd7, 0xcb, 0x69, 0xe4, 0x0a, 0xea, 0x0e, 0xac, 0x66, 0xd9, 0x7a, 0xd4, 0xb1, 0x3d, 0xc2, 0x9d, + 0x4d, 0xc4, 0x63, 0x83, 0x74, 0xe3, 0x59, 0x21, 0x45, 0x5d, 0xcb, 0x99, 0x51, 0x7f, 0x57, 0x82, + 0x55, 0x8d, 0x78, 0x8e, 0x79, 0x48, 0xc2, 0x60, 0x79, 0x3a, 0xe9, 0xce, 0xf7, 0xa1, 0x8c, 0x29, + 0x95, 0x66, 0xb2, 0x7b, 0x62, 0x09, 0x85, 0xc6, 0xa9, 0xa2, 0xb7, 0x60, 0x19, 0x5b, 0x1d, 0xa3, + 0xe7, 0x3b, 0xbe, 0x17, 0x6e, 0x4b, 0x18, 0x55, 0x43, 0x1b, 0x9d, 0xe0, 0x01, 0xc7, 0x13, 0x1e, + 0xb9, 0x6b, 0x77, 0xc9, 0x8f, 0x45, 0x0e, 0x55, 0xd6, 0x92, 0x20, 0x55, 0x87, 0x73, 0x23, 0x4a, + 0x92, 0x0a, 0x4f, 0xa6, 0x6d, 0xc5, 0x4c, 0xda, 0x96, 0x2b, 0x46, 0x69, 0x8c, 0x18, 0xea, 0xcb, + 0x22, 0x2c, 0xc5, 0xce, 0x25, 0xc9, 0x5f, 0x84, 0x86, 0x25, 0x61, 0x9e, 0x52, 0x14, 0x31, 0x33, + 0x06, 0xa4, 0x33, 0xb8, 0x52, 0x36, 0x83, 0x5b, 0x85, 0x5a, 0x90, 0xba, 0xcb, 0xad, 0xcb, 0x51, + 0x4a, 0xe4, 0x4a, 0x46, 0xe4, 0x35, 0x00, 0x2f, 0x8a, 0x70, 0x4a, 0x4d, 0xcc, 0x26, 0x20, 0x48, + 0x85, 0xb9, 0xe0, 0xbe, 0xd7, 0x88, 0xe7, 0x9b, 0x4c, 0x99, 0x11, 0x18, 0x29, 0x98, 0xf0, 0x37, + 0xc7, 0xb2, 0xb0, 0xdd, 0xf5, 0x94, 0xba, 0x10, 0x39, 0x1a, 0xab, 0x0e, 0x2c, 0x3e, 0x30, 0xf8, + 0xfe, 0x0e, 0xbc, 0xd3, 0x71, 0x95, 0xf7, 0xa0, 0xc2, 0x99, 0x71, 0xa1, 0x3a, 0x2e, 0xb6, 0xf5, + 0x3e, 0x09, 0xf5, 0x18, 0x8d, 0x79, 0x10, 0x60, 0xb8, 0xe7, 0x29, 0x25, 0x01, 0x17, 0xdf, 0xea, + 0x1f, 0x4a, 0x81, 0xa4, 0x9b, 0x94, 0x7a, 0x5f, 0x7d, 0x01, 0x90, 0x9f, 0x92, 0x94, 0x47, 0x53, + 0x92, 0x8c, 0xc8, 0x5f, 0x26, 0x25, 0x39, 0xa1, 0x4b, 0x4e, 0xf5, 0x61, 0x66, 0x93, 0x52, 0x2e, + 0x08, 0xba, 0x0e, 0x15, 0x4c, 0x69, 0xa0, 0xf0, 0x4c, 0x3c, 0x97, 0x28, 0xfc, 0xbf, 0x14, 0x49, + 0xa0, 0x36, 0x6f, 0x41, 0x23, 0x02, 0x1d, 0xc5, 0xb6, 0x91, 0x64, 0xbb, 0x0e, 0x10, 0xe4, 0xdc, + 0xbb, 0xf6, 0x81, 0xc3, 0x8f, 0x94, 0x3b, 0x82, 0x5c, 0x2a, 0xbe, 0xd5, 0xdb, 0x21, 0x86, 0x90, + 0xed, 0x2d, 0xa8, 0x1a, 0x8c, 0x58, 0xa1, 0x70, 0xab, 0x49, 0xe1, 0x62, 0x42, 0x5a, 0x80, 0xa4, + 0xfe, 0xb9, 0x0e, 0xe7, 0xf9, 0x89, 0x3d, 0x16, 0x2e, 0xb4, 0x49, 0xe9, 0x1d, 0xc2, 0xb0, 0x61, + 0x7a, 0xdf, 0xf1, 0x89, 0x3b, 0x7c, 0xcd, 0x86, 0xd1, 0x83, 0x5a, 0xe0, 0x81, 0x32, 0x5a, 0x9e, + 0x78, 0xf9, 0x25, 0xc9, 0xc7, 0x35, 0x57, 0xf9, 0xf5, 0xd4, 0x5c, 0x79, 0x35, 0x50, 0xe5, 0x94, + 0x6a, 0xa0, 0xf1, 0x65, 0x70, 0xa2, 0xb8, 0xae, 0xa5, 0x8b, 0xeb, 0x9c, 0xd2, 0x62, 0xe6, 0xb8, + 0xa5, 0x45, 0x3d, 0xb7, 0xb4, 0xb0, 0x72, 0xfd, 0xb8, 0x21, 0xd4, 0xfd, 0xad, 0xa4, 0x05, 0x8e, + 0xb5, 0xb5, 0x69, 0x8a, 0x0c, 0x78, 0xad, 0x45, 0xc6, 0xa7, 0xa9, 0xa2, 0x21, 0x28, 0xdb, 0xdf, + 0x3d, 0xde, 0x9e, 0x26, 0x94, 0x0f, 0xff, 0x77, 0xa9, 0xf7, 0xcf, 0x45, 0xc6, 0x45, 0x9d, 0x58, + 0x07, 0xd1, 0x65, 0xcf, 0xef, 0x21, 0x7e, 0xed, 0xca, 0xa0, 0xc5, 0xbf, 0xd1, 0x35, 0xa8, 0x70, + 0x25, 0xcb, 0x94, 0xf8, 0x5c, 0x52, 0x9f, 0xfc, 0x24, 0x36, 0x29, 0x7d, 0x4c, 0x89, 0xae, 0x09, + 0x24, 0x74, 0x1b, 0x1a, 0x91, 0xe1, 0x4b, 0xcf, 0xba, 0x98, 0x5c, 0x11, 0xf9, 0x49, 0xb8, 0x2c, + 0x46, 0xe7, 0x6b, 0xbb, 0x86, 0x4b, 0x74, 0x91, 0x30, 0x56, 0x47, 0xd7, 0xde, 0x09, 0x27, 0xa3, + 0xb5, 0x11, 0x3a, 0xba, 0x0e, 0xb5, 0xa0, 0xcf, 0x21, 0x3c, 0x68, 0xf6, 0xc6, 0xf9, 0xd1, 0x60, + 0x1a, 0xae, 0x92, 0x88, 0xea, 0x9f, 0x8a, 0xf0, 0x46, 0x6c, 0x10, 0xa1, 0x37, 0x85, 0x39, 0xfb, + 0x57, 0x7f, 0xe3, 0x5e, 0x81, 0x05, 0x51, 0x24, 0xc4, 0xed, 0x8e, 0xa0, 0xf3, 0x96, 0x81, 0xaa, + 0xbf, 0x2f, 0xc2, 0xe5, 0xd1, 0x7d, 0x6c, 0xf5, 0xb1, 0xcb, 0xa2, 0xe3, 0x3d, 0x8d, 0xbd, 0x84, + 0x17, 0x5e, 0x29, 0xbe, 0xf0, 0x52, 0xfb, 0x2b, 0xa7, 0xf7, 0xa7, 0xfe, 0xb1, 0x04, 0xb3, 0x09, + 0x03, 0xca, 0xbb, 0x30, 0x79, 0x32, 0x28, 0xec, 0x56, 0x94, 0x85, 0xe2, 0x52, 0x68, 0x68, 0x09, + 0x08, 0x1a, 0x00, 0x50, 0xec, 0x62, 0x8b, 0x30, 0xe2, 0xf2, 0x48, 0xce, 0x3d, 0xfe, 0xfe, 0xf4, + 0xd1, 0x65, 0x3f, 0xa4, 0xa9, 0x25, 0xc8, 0xf3, 0x6c, 0x56, 0xb0, 0xf6, 0x64, 0xfc, 0x96, 0x23, + 0xf4, 0x05, 0x2c, 0x1c, 0x18, 0x26, 0xd9, 0x8f, 0x05, 0xa9, 0x09, 0x41, 0x1e, 0x4d, 0x2f, 0xc8, + 0xbd, 0x24, 0x5d, 0x2d, 0xc3, 0x46, 0xbd, 0x0a, 0x4b, 0x59, 0x7f, 0xe2, 0x42, 0x1a, 0x16, 0xee, + 0x45, 0xda, 0x92, 0x23, 0x15, 0xc1, 0x52, 0xd6, 0x7f, 0xd4, 0x7f, 0x96, 0x60, 0x25, 0x22, 0xb7, + 0x69, 0xdb, 0x8e, 0x6f, 0xeb, 0xa2, 0x75, 0x98, 0x7b, 0x16, 0x67, 0xa1, 0xca, 0x0c, 0x66, 0x46, + 0x89, 0x8f, 0x18, 0xf0, 0xbb, 0x8b, 0x39, 0x8e, 0xc9, 0x0c, 0x2a, 0x0f, 0x38, 0x1c, 0x06, 0x67, + 0xff, 0xdc, 0x37, 0x5c, 0xd2, 0x15, 0x91, 0xa0, 0xae, 0x45, 0x63, 0x3e, 0xc7, 0xb3, 0x1a, 0x91, + 0xe2, 0x07, 0xca, 0x8c, 0xc6, 0xc2, 0xee, 0x1d, 0xd3, 0x24, 0x3a, 0x57, 0x47, 0xa2, 0x08, 0xc8, + 0x40, 0x45, 0x71, 0xc1, 0x5c, 0xc3, 0xee, 0xc9, 0x12, 0x40, 0x8e, 0xb8, 0x9c, 0xd8, 0x75, 0xf1, + 0x50, 0x66, 0xfe, 0xc1, 0x00, 0x7d, 0x08, 0x65, 0x0b, 0x53, 0x79, 0xd1, 0x5d, 0x4d, 0x45, 0x87, + 0x3c, 0x0d, 0xb4, 0xf6, 0x30, 0x0d, 0x6e, 0x02, 0xbe, 0xac, 0xf9, 0x1e, 0xd4, 0x43, 0xc0, 0x97, + 0x4a, 0x09, 0x3f, 0x87, 0xf9, 0x54, 0xf0, 0x41, 0x4f, 0x61, 0x35, 0xb6, 0xa8, 0x24, 0x43, 0x99, + 0x04, 0xbe, 0x71, 0xa4, 0x64, 0xda, 0x18, 0x02, 0xea, 0x73, 0x58, 0xe6, 0x26, 0x23, 0x1c, 0xff, + 0x94, 0x4a, 0x9b, 0x0f, 0xa0, 0x11, 0xb1, 0xcc, 0xb5, 0x99, 0x26, 0xd4, 0x0f, 0xc3, 0x96, 0x6e, + 0x50, 0xdb, 0x44, 0x63, 0x75, 0x13, 0x50, 0x52, 0x5e, 0x79, 0x03, 0x5d, 0x4b, 0x27, 0xc5, 0x2b, + 0xd9, 0xeb, 0x46, 0xa0, 0x87, 0x39, 0xf1, 0xdf, 0x4b, 0xb0, 0xb8, 0x6d, 0x88, 0x1e, 0xc9, 0x29, + 0x05, 0xb9, 0xab, 0xb0, 0xe4, 0xf9, 0x1d, 0xcb, 0xe9, 0xfa, 0x26, 0x91, 0x49, 0x81, 0xbc, 0xe9, + 0x47, 0xe0, 0x93, 0x82, 0x1f, 0x57, 0x16, 0xc5, 0xac, 0x2f, 0xab, 0x5f, 0xf1, 0x8d, 0x3e, 0x84, + 0xf3, 0x0f, 0xc9, 0x17, 0x72, 0x3f, 0xdb, 0xa6, 0xd3, 0xe9, 0x18, 0x76, 0x2f, 0x64, 0x52, 0x15, + 0x4c, 0xc6, 0x23, 0xe4, 0xa5, 0x8a, 0xb5, 0xfc, 0x54, 0x31, 0xaa, 0xa0, 0xb7, 0x1c, 0xcb, 0x32, + 0x98, 0xcc, 0x28, 0x53, 0x30, 0xf5, 0x67, 0x45, 0x58, 0x8a, 0x35, 0x2b, 0xcf, 0xe6, 0x56, 0xe0, + 0x43, 0xc1, 0xc9, 0x5c, 0x4e, 0x9e, 0x4c, 0x16, 0xf5, 0xd5, 0xdd, 0x67, 0x2e, 0xe9, 0x3e, 0xbf, + 0x2c, 0xc1, 0xca, 0xb6, 0xc1, 0xc2, 0xc0, 0x65, 0xfc, 0xaf, 0x9d, 0x72, 0xce, 0x99, 0x54, 0x8e, + 0x77, 0x26, 0xd5, 0x9c, 0x33, 0x69, 0xc1, 0x6a, 0x56, 0x19, 0xf2, 0x60, 0xce, 0x42, 0x95, 0x8a, + 0xa6, 0x73, 0xd0, 0x57, 0x08, 0x06, 0xea, 0x4f, 0x67, 0xe0, 0xd2, 0xa7, 0xb4, 0x8b, 0x59, 0xd4, + 0x33, 0xba, 0xe7, 0xb8, 0xa2, 0xeb, 0x7c, 0x3a, 0x5a, 0xcc, 0xbc, 0x0c, 0x96, 0x26, 0xbe, 0x0c, + 0x96, 0x27, 0xbc, 0x0c, 0x56, 0x8e, 0xf5, 0x32, 0x58, 0x3d, 0xb5, 0x97, 0xc1, 0xd1, 0x5a, 0xab, + 0x96, 0x5b, 0x6b, 0x3d, 0x4d, 0xd5, 0x23, 0x33, 0xc2, 0x6d, 0xbe, 0x99, 0x74, 0x9b, 0x89, 0xa7, + 0x33, 0xf1, 0x49, 0x23, 0xf3, 0xa0, 0x56, 0x3f, 0xf2, 0x41, 0xad, 0x31, 0xfa, 0xa0, 0x96, 0xff, + 0x26, 0x03, 0x63, 0xdf, 0x64, 0xae, 0xc0, 0x82, 0x37, 0xb4, 0x75, 0xd2, 0x8d, 0x3a, 0x89, 0xb3, + 0xc1, 0xb6, 0xd3, 0xd0, 0x94, 0x47, 0xcc, 0x65, 0x3c, 0x22, 0xb2, 0xd4, 0xf9, 0x84, 0xa5, 0xe6, + 0xf9, 0xc9, 0xc2, 0xd8, 0x32, 0x37, 0xf3, 0x5c, 0xb2, 0x98, 0xfb, 0x5c, 0xf2, 0x5f, 0x53, 0x6c, + 0x7d, 0x06, 0x6b, 0xe3, 0x4e, 0x59, 0x3a, 0xaf, 0x02, 0x33, 0x7a, 0x1f, 0xdb, 0x3d, 0xd1, 0x16, + 0x14, 0xd5, 0xbf, 0x1c, 0x4e, 0xaa, 0x0e, 0xd4, 0xdf, 0x94, 0x60, 0x65, 0x4b, 0xe0, 0x65, 0xbb, + 0xe6, 0x09, 0xa7, 0x2a, 0x4e, 0x70, 0xaa, 0x91, 0x66, 0xed, 0x06, 0x2c, 0xea, 0xbe, 0xeb, 0xf2, + 0x14, 0x23, 0x1d, 0xcf, 0xb2, 0x60, 0x1e, 0x1e, 0x29, 0x17, 0x24, 0xd9, 0x54, 0x0e, 0x7c, 0x74, + 0x04, 0x1e, 0x1f, 0x78, 0x35, 0x79, 0xe0, 0x61, 0xe0, 0xa9, 0xbd, 0x96, 0xb4, 0xe4, 0x1d, 0x58, + 0xcd, 0xaa, 0xe6, 0xe8, 0x5e, 0xf9, 0x8d, 0x7f, 0xcf, 0xc1, 0x72, 0x5c, 0x47, 0xf1, 0xbf, 0x86, + 0x4e, 0xd0, 0x23, 0x58, 0x0a, 0x1f, 0xec, 0xc2, 0xd6, 0x38, 0x9a, 0xf4, 0x1a, 0xd5, 0xbc, 0x98, + 0x3f, 0x19, 0x08, 0xa0, 0x16, 0x90, 0x0e, 0xe7, 0xb3, 0x04, 0xe3, 0x87, 0xaf, 0x6f, 0x4c, 0xa0, + 0x1c, 0x61, 0x1d, 0xc5, 0x62, 0xa3, 0x88, 0x9e, 0xc2, 0x42, 0xfa, 0x79, 0x06, 0xa5, 0x12, 0xcb, + 0xdc, 0x17, 0xa3, 0xa6, 0x3a, 0x09, 0x25, 0x92, 0xff, 0x19, 0x77, 0xac, 0xd4, 0x4b, 0x04, 0x52, + 0xd3, 0x3d, 0x96, 0xbc, 0xb7, 0x9c, 0xe6, 0xd7, 0x27, 0xe2, 0x44, 0xd4, 0x3f, 0x80, 0x7a, 0xd8, + 0x9d, 0x4f, 0xab, 0x39, 0xd3, 0xb3, 0x6f, 0x2e, 0xa5, 0xe9, 0x1d, 0x78, 0x6a, 0x01, 0x7d, 0x04, + 0xb3, 0x1c, 0xed, 0xd1, 0xd6, 0xee, 0x13, 0xdc, 0x7b, 0xa5, 0xf5, 0xf5, 0xb0, 0x7b, 0x3d, 0xba, + 0x38, 0xd1, 0xd3, 0x6e, 0x9e, 0xc9, 0xe9, 0x23, 0xab, 0x05, 0xf4, 0xed, 0x80, 0xff, 0xbe, 0xfc, + 0xc1, 0xc5, 0x6a, 0x2b, 0xf8, 0x7d, 0x4f, 0x2b, 0xfc, 0x7d, 0x4f, 0xeb, 0xae, 0x45, 0xd9, 0xb0, + 0x99, 0xd3, 0xe8, 0x95, 0x04, 0x9e, 0xc1, 0xfc, 0x36, 0x61, 0x71, 0x5f, 0x06, 0x5d, 0x3e, 0x56, + 0xf7, 0xaa, 0xa9, 0x66, 0xd1, 0x46, 0x5b, 0x3b, 0x6a, 0x01, 0xfd, 0xba, 0x08, 0x67, 0xb6, 0x09, + 0xcb, 0x76, 0x3a, 0xd0, 0xdb, 0xf9, 0x4c, 0xc6, 0x74, 0x44, 0x9a, 0x0f, 0xa7, 0xf5, 0xd6, 0x34, + 0x59, 0xb5, 0x80, 0x7e, 0x55, 0x84, 0x85, 0x6d, 0xc2, 0xcf, 0x2d, 0x92, 0xe9, 0xfa, 0x64, 0x99, + 0x72, 0xba, 0x1b, 0xcd, 0x29, 0xbb, 0x8a, 0x09, 0xee, 0x6a, 0x01, 0xfd, 0xb6, 0x08, 0xe7, 0x12, + 0xba, 0x4a, 0xf2, 0x7b, 0x15, 0xd9, 0x3e, 0x99, 0xf2, 0xa7, 0x3d, 0x09, 0x92, 0x6a, 0x01, 0xed, + 0x0b, 0x33, 0x89, 0x8b, 0x27, 0x74, 0x29, 0xb7, 0x4a, 0x8a, 0xb8, 0xaf, 0x8d, 0x9b, 0x8e, 0x4c, + 0xe3, 0x13, 0x98, 0xdd, 0x26, 0x2c, 0xcc, 0xe2, 0xd3, 0xc6, 0x9f, 0x29, 0xb0, 0xd2, 0xd1, 0x27, + 0x9b, 0xf8, 0x0b, 0x23, 0x5e, 0x0e, 0x68, 0x25, 0x32, 0xd5, 0x74, 0xf8, 0xc9, 0x4d, 0xe9, 0xd3, + 0x46, 0x9c, 0x9f, 0xe8, 0xaa, 0x05, 0xf4, 0x1c, 0x56, 0xf3, 0xef, 0x53, 0xf4, 0xe6, 0xb1, 0x33, + 0xab, 0xe6, 0xd5, 0xe3, 0xa0, 0x66, 0x36, 0x94, 0xbe, 0x51, 0xd2, 0x1b, 0xca, 0xbd, 0x88, 0xd3, + 0x1b, 0xca, 0xbf, 0x90, 0xd4, 0xc2, 0xc7, 0x9b, 0x7f, 0x79, 0xb9, 0x56, 0xfc, 0xeb, 0xcb, 0xb5, + 0xe2, 0xbf, 0x5e, 0xae, 0x15, 0xbf, 0x77, 0xf3, 0x88, 0x1f, 0x18, 0x26, 0x7e, 0x0d, 0x89, 0xa9, + 0xa1, 0x9b, 0x06, 0xb1, 0x59, 0xa7, 0x26, 0x02, 0xcc, 0xcd, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, + 0xe4, 0x08, 0xc6, 0x90, 0x2c, 0x29, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -2676,6 +2821,7 @@ type RepoServerServiceClient interface { GetGitDirectories(ctx context.Context, in *GitDirectoriesRequest, opts ...grpc.CallOption) (*GitDirectoriesResponse, error) // UpdateRevisionForPaths will compare two revisions and update the cache with the new revision if no changes are detected in the provided paths UpdateRevisionForPaths(ctx context.Context, in *UpdateRevisionForPathsRequest, opts ...grpc.CallOption) (*UpdateRevisionForPathsResponse, error) + GetChangeRevision(ctx context.Context, in *ChangeRevisionRequest, opts ...grpc.CallOption) (*ChangeRevisionResponse, error) } type repoServerServiceClient struct { @@ -2855,6 +3001,15 @@ func (c *repoServerServiceClient) UpdateRevisionForPaths(ctx context.Context, in return out, nil } +func (c *repoServerServiceClient) GetChangeRevision(ctx context.Context, in *ChangeRevisionRequest, opts ...grpc.CallOption) (*ChangeRevisionResponse, error) { + out := new(ChangeRevisionResponse) + err := c.cc.Invoke(ctx, "/repository.RepoServerService/GetChangeRevision", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // RepoServerServiceServer is the server API for RepoServerService service. type RepoServerServiceServer interface { // GenerateManifest generates manifest for application in specified repo name and revision @@ -2889,6 +3044,7 @@ type RepoServerServiceServer interface { GetGitDirectories(context.Context, *GitDirectoriesRequest) (*GitDirectoriesResponse, error) // UpdateRevisionForPaths will compare two revisions and update the cache with the new revision if no changes are detected in the provided paths UpdateRevisionForPaths(context.Context, *UpdateRevisionForPathsRequest) (*UpdateRevisionForPathsResponse, error) + GetChangeRevision(context.Context, *ChangeRevisionRequest) (*ChangeRevisionResponse, error) } // UnimplementedRepoServerServiceServer can be embedded to have forward compatible implementations. @@ -2943,6 +3099,9 @@ func (*UnimplementedRepoServerServiceServer) GetGitDirectories(ctx context.Conte func (*UnimplementedRepoServerServiceServer) UpdateRevisionForPaths(ctx context.Context, req *UpdateRevisionForPathsRequest) (*UpdateRevisionForPathsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateRevisionForPaths not implemented") } +func (*UnimplementedRepoServerServiceServer) GetChangeRevision(ctx context.Context, req *ChangeRevisionRequest) (*ChangeRevisionResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetChangeRevision not implemented") +} func RegisterRepoServerServiceServer(s *grpc.Server, srv RepoServerServiceServer) { s.RegisterService(&_RepoServerService_serviceDesc, srv) @@ -3244,6 +3403,24 @@ func _RepoServerService_UpdateRevisionForPaths_Handler(srv interface{}, ctx cont return interceptor(ctx, in, info, handler) } +func _RepoServerService_GetChangeRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ChangeRevisionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RepoServerServiceServer).GetChangeRevision(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/repository.RepoServerService/GetChangeRevision", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RepoServerServiceServer).GetChangeRevision(ctx, req.(*ChangeRevisionRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _RepoServerService_serviceDesc = grpc.ServiceDesc{ ServiceName: "repository.RepoServerService", HandlerType: (*RepoServerServiceServer)(nil), @@ -3308,6 +3485,10 @@ var _RepoServerService_serviceDesc = grpc.ServiceDesc{ MethodName: "UpdateRevisionForPaths", Handler: _RepoServerService_UpdateRevisionForPaths_Handler, }, + { + MethodName: "GetChangeRevision", + Handler: _RepoServerService_GetChangeRevision_Handler, + }, }, Streams: []grpc.StreamDesc{ { @@ -5576,6 +5757,116 @@ func (m *UpdateRevisionForPathsResponse) MarshalToSizedBuffer(dAtA []byte) (int, return len(dAtA) - i, nil } +func (m *ChangeRevisionRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ChangeRevisionRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ChangeRevisionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Repo != nil { + { + size, err := m.Repo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintRepository(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + if len(m.Paths) > 0 { + for iNdEx := len(m.Paths) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Paths[iNdEx]) + copy(dAtA[i:], m.Paths[iNdEx]) + i = encodeVarintRepository(dAtA, i, uint64(len(m.Paths[iNdEx]))) + i-- + dAtA[i] = 0x2a + } + } + if len(m.PreviousRevision) > 0 { + i -= len(m.PreviousRevision) + copy(dAtA[i:], m.PreviousRevision) + i = encodeVarintRepository(dAtA, i, uint64(len(m.PreviousRevision))) + i-- + dAtA[i] = 0x22 + } + if len(m.CurrentRevision) > 0 { + i -= len(m.CurrentRevision) + copy(dAtA[i:], m.CurrentRevision) + i = encodeVarintRepository(dAtA, i, uint64(len(m.CurrentRevision))) + i-- + dAtA[i] = 0x1a + } + if len(m.Namespace) > 0 { + i -= len(m.Namespace) + copy(dAtA[i:], m.Namespace) + i = encodeVarintRepository(dAtA, i, uint64(len(m.Namespace))) + i-- + dAtA[i] = 0x12 + } + if len(m.AppName) > 0 { + i -= len(m.AppName) + copy(dAtA[i:], m.AppName) + i = encodeVarintRepository(dAtA, i, uint64(len(m.AppName))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ChangeRevisionResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ChangeRevisionResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ChangeRevisionResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Revision) > 0 { + i -= len(m.Revision) + copy(dAtA[i:], m.Revision) + i = encodeVarintRepository(dAtA, i, uint64(len(m.Revision))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func encodeVarintRepository(dAtA []byte, offset int, v uint64) int { offset -= sovRepository(v) base := offset @@ -6596,6 +6887,60 @@ func (m *UpdateRevisionForPathsResponse) Size() (n int) { return n } +func (m *ChangeRevisionRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.AppName) + if l > 0 { + n += 1 + l + sovRepository(uint64(l)) + } + l = len(m.Namespace) + if l > 0 { + n += 1 + l + sovRepository(uint64(l)) + } + l = len(m.CurrentRevision) + if l > 0 { + n += 1 + l + sovRepository(uint64(l)) + } + l = len(m.PreviousRevision) + if l > 0 { + n += 1 + l + sovRepository(uint64(l)) + } + if len(m.Paths) > 0 { + for _, s := range m.Paths { + l = len(s) + n += 1 + l + sovRepository(uint64(l)) + } + } + if m.Repo != nil { + l = m.Repo.Size() + n += 1 + l + sovRepository(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ChangeRevisionResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Revision) + if l > 0 { + n += 1 + l + sovRepository(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func sovRepository(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -13046,6 +13391,336 @@ func (m *UpdateRevisionForPathsResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *ChangeRevisionRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ChangeRevisionRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ChangeRevisionRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AppName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRepository + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthRepository + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AppName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRepository + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthRepository + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Namespace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentRevision", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRepository + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthRepository + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CurrentRevision = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PreviousRevision", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRepository + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthRepository + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PreviousRevision = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Paths", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRepository + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthRepository + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Paths = append(m.Paths, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Repo", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRepository + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthRepository + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Repo == nil { + m.Repo = &v1alpha1.Repository{} + } + if err := m.Repo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRepository(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthRepository + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ChangeRevisionResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ChangeRevisionResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ChangeRevisionResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Revision", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRepository + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthRepository + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Revision = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRepository(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthRepository + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipRepository(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/reposerver/repository/cf_repository.go b/reposerver/repository/cf_repository.go new file mode 100644 index 0000000000000..2e2648ad08006 --- /dev/null +++ b/reposerver/repository/cf_repository.go @@ -0,0 +1,105 @@ +package repository + +import ( + "context" + goio "io" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" + "github.com/argoproj/argo-cd/v3/reposerver/apiclient" + argopath "github.com/argoproj/argo-cd/v3/util/app/path" + "github.com/argoproj/argo-cd/v3/util/git" + "github.com/argoproj/argo-cd/v3/util/io" + "github.com/argoproj/argo-cd/v3/util/kustomize" + + log "github.com/sirupsen/logrus" +) + +func (s *Service) getCacheKeyWithKustomizeComponents( + revision string, + repo *v1alpha1.Repository, + source *v1alpha1.ApplicationSource, + settings operationSettings, + gitClient git.Client, +) (string, error) { + closer, err := s.repoLock.Lock(gitClient.Root(), revision, settings.allowConcurrent, func() (goio.Closer, error) { + return s.checkoutRevision(gitClient, revision, s.initConstants.SubmoduleEnabled) + }) + if err != nil { + return "", err + } + + defer io.Close(closer) + + appPath, err := argopath.Path(gitClient.Root(), source.Path) + if err != nil { + return "", err + } + + k := kustomize.NewKustomizeApp(gitClient.Root(), appPath, repo.GetGitCreds(s.gitCredsStore), repo.Repo, source.Kustomize.Version, "", "") + + resolveRevisionFunc := func(repoURL, revision string, _ git.Creds) (string, error) { + cloneRepo := *repo + cloneRepo.Repo = repoURL + _, res, err := s.newClientResolveRevision(&cloneRepo, revision) + return res, err + } + + return k.GetCacheKeyWithComponents(revision, source.Kustomize, resolveRevisionFunc) +} + +func (s *Service) GetChangeRevision(_ context.Context, request *apiclient.ChangeRevisionRequest) (*apiclient.ChangeRevisionResponse, error) { + logCtx := log.WithFields(log.Fields{"application": request.AppName, "appNamespace": request.Namespace}) + + repo := request.GetRepo() + currentRevision := request.GetCurrentRevision() + previousRevision := request.GetPreviousRevision() + refreshPaths := request.GetPaths() + + if repo == nil { + return nil, status.Error(codes.InvalidArgument, "must pass a valid repo") + } + + if len(refreshPaths) == 0 { + return nil, status.Error(codes.InvalidArgument, "must pass a refresh path") + } + + gitClientOpts := git.WithCache(s.cache, true) + gitClient, revision, err := s.newClientResolveRevision(repo, currentRevision, gitClientOpts) + if err != nil { + return nil, status.Errorf(codes.Internal, "unable to resolve git revision %s: %v", revision, err) + } + + s.metricsServer.IncPendingRepoRequest(repo.Repo) + defer s.metricsServer.DecPendingRepoRequest(repo.Repo) + + closer, err := s.repoLock.Lock(gitClient.Root(), revision, true, func() (goio.Closer, error) { + return s.checkoutRevision(gitClient, revision, false) + }) + if err != nil { + return nil, status.Errorf(codes.Internal, "unable to checkout git repo %s with revision %s: %v", repo.Repo, revision, err) + } + defer io.Close(closer) + revisions, err := gitClient.ListRevisions(previousRevision, revision) + if err != nil { + return nil, status.Errorf(codes.Internal, "failed to get revisions %s..%s", previousRevision, revision) + } + for _, rev := range revisions { + files, err := gitClient.DiffTree(rev) + if err != nil { + continue + } + changedFiles := argopath.AppFilesHaveChanged(refreshPaths, files) + if changedFiles { + logCtx.Debugf("changes found for application %s in repo %s from revision %s to revision %s", request.AppName, repo.Repo, previousRevision, revision) + return &apiclient.ChangeRevisionResponse{ + Revision: rev, + }, nil + } + } + + logCtx.Debugf("changes not found for application %s in repo %s from revision %s to revision %s", request.AppName, repo.Repo, previousRevision, revision) + return &apiclient.ChangeRevisionResponse{}, nil +} diff --git a/reposerver/repository/repository.go b/reposerver/repository/repository.go index 0de5a66af6780..62bb4890a1316 100644 --- a/reposerver/repository/repository.go +++ b/reposerver/repository/repository.go @@ -355,8 +355,26 @@ func (s *Service) runRepoOperation( return err } + cacheKey := revision + + if source.Kustomize != nil && len(source.Kustomize.Components) > 0 { + cacheKey, err = s.getCacheKeyWithKustomizeComponents( + revision, + repo, + source, + settings, + gitClient, + ) + if err != nil { + log.WithError(err). + WithField("repo", repo.Repo). + Warn("failed to calculate cache key with components, using only the revision of the base repository") + cacheKey = revision + } + } + if !settings.noCache { - if ok, err := cacheFn(revision, repoRefs, true); ok { + if ok, err := cacheFn(cacheKey, repoRefs, true); ok { return err } } @@ -493,7 +511,7 @@ func (s *Service) runRepoOperation( // Here commitSHA refers to the SHA of the actual commit, whereas revision refers to the branch/tag name etc // We use the commitSHA to generate manifests and store them in cache, and revision to retrieve them from cache - return operation(gitClient.Root(), commitSHA, revision, func() (*operationContext, error) { + return operation(gitClient.Root(), commitSHA, cacheKey, func() (*operationContext, error) { var signature string if verifyCommit { // When the revision is an annotated tag, we need to pass the unresolved revision (i.e. the tag name) @@ -1531,7 +1549,7 @@ func GenerateManifests(ctx context.Context, appPath, repoRoot, revision string, targetObjs, _, commands, err = k.Build(q.ApplicationSource.Kustomize, q.KustomizeOptions, env, &kustomize.BuildOpts{ KubeVersion: kubeVersion, APIVersions: q.ApplicationSource.GetAPIVersionsOrDefault(q.ApiVersions), - }) + }, q.Namespace) case v1alpha1.ApplicationSourceTypePlugin: pluginName := "" if q.ApplicationSource.Plugin != nil { @@ -2341,7 +2359,7 @@ func populateKustomizeAppDetails(res *apiclient.RepoAppDetailsResponse, q *apicl ApplicationSource: q.Source, } env := newEnv(&fakeManifestRequest, reversion) - _, images, _, err := k.Build(q.Source.Kustomize, q.KustomizeOptions, env, nil) + _, images, _, err := k.Build(q.Source.Kustomize, q.KustomizeOptions, env, nil, "") if err != nil { return err } diff --git a/reposerver/repository/repository.proto b/reposerver/repository/repository.proto index b52ccf841b7f7..51146986d2e1e 100644 --- a/reposerver/repository/repository.proto +++ b/reposerver/repository/repository.proto @@ -3,6 +3,8 @@ option go_package = "github.com/argoproj/argo-cd/v3/reposerver/apiclient"; package repository; +import "k8s.io/api/core/v1/generated.proto"; +import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1/generated.proto"; import "google/protobuf/empty.proto"; @@ -296,6 +298,19 @@ message UpdateRevisionForPathsResponse { string revision = 2; } +message ChangeRevisionRequest { + string appName = 1; + string namespace = 2; + string currentRevision = 3; + string previousRevision = 4; + repeated string paths = 5; + github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.Repository repo = 6; +} + +message ChangeRevisionResponse { + string revision = 1; +} + // ManifestService service RepoServerService { @@ -362,4 +377,7 @@ service RepoServerService { // UpdateRevisionForPaths will compare two revisions and update the cache with the new revision if no changes are detected in the provided paths rpc UpdateRevisionForPaths(UpdateRevisionForPathsRequest) returns (UpdateRevisionForPathsResponse) { } + + rpc GetChangeRevision(ChangeRevisionRequest) returns (ChangeRevisionResponse) { + } } diff --git a/reposerver/repository/testdata/symlinks/bam b/reposerver/repository/testdata/symlinks/bam new file mode 120000 index 0000000000000..3f95386662513 --- /dev/null +++ b/reposerver/repository/testdata/symlinks/bam @@ -0,0 +1 @@ +baz \ No newline at end of file diff --git a/reposerver/repository/testdata/symlinks/bar b/reposerver/repository/testdata/symlinks/bar new file mode 120000 index 0000000000000..19102815663d2 --- /dev/null +++ b/reposerver/repository/testdata/symlinks/bar @@ -0,0 +1 @@ +foo \ No newline at end of file diff --git a/reposerver/repository/testdata/symlinks/baz b/reposerver/repository/testdata/symlinks/baz new file mode 120000 index 0000000000000..ba0e162e1c474 --- /dev/null +++ b/reposerver/repository/testdata/symlinks/baz @@ -0,0 +1 @@ +bar \ No newline at end of file diff --git a/reposerver/repository/testdata/symlinks/foo b/reposerver/repository/testdata/symlinks/foo new file mode 100644 index 0000000000000..ce013625030ba --- /dev/null +++ b/reposerver/repository/testdata/symlinks/foo @@ -0,0 +1 @@ +hello diff --git a/resource_customizations/route53.aws.crossplane.io/ResourceRecordSet/heatlh.lua b/resource_customizations/route53.aws.crossplane.io/ResourceRecordSet/heatlh.lua new file mode 100644 index 0000000000000..0cf5253e910ff --- /dev/null +++ b/resource_customizations/route53.aws.crossplane.io/ResourceRecordSet/heatlh.lua @@ -0,0 +1,41 @@ +local hs = {} +if obj.status ~= nil then + if obj.status.conditions ~= nil then + local ready = false + local synced = false + local suspended = false + for i, condition in ipairs(obj.status.conditions) do + + if condition.type == "Ready" then + ready = condition.status == "True" + ready_message = condition.reason + elseif condition.type == "Synced" then + synced = condition.status == "True" + if condition.reason == "ReconcileError" then + synced_message = condition.message + elseif condition.reason == "ReconcilePaused" then + suspended = true + suspended_message = condition.reason + end + end + end + if ready and synced then + hs.status = "Healthy" + hs.message = ready_message + elseif synced == false and suspended == true then + hs.status = "Suspended" + hs.message = suspended_message + elseif ready == false and synced == true and suspended == false then + hs.status = "Progressing" + hs.message = "Waiting for resourcrecordset to be available" + else + hs.status = "Degraded" + hs.message = synced_message + end + return hs + end +end + +hs.status = "Progressing" +hs.message = "Waiting for resourcrecordset to be created" +return hs diff --git a/server/application/application.go b/server/application/application.go index 6ab9e725a7a9f..92c8b36fef2f0 100644 --- a/server/application/application.go +++ b/server/application/application.go @@ -541,7 +541,7 @@ func (s *Server) GetManifests(ctx context.Context, q *application.ApplicationMan return fmt.Errorf("error getting kustomize settings: %w", err) } - kustomizeOptions, err := kustomizeSettings.GetOptions(source) + kustomizeOptions, err := kustomizeSettings.GetOptions(source, s.settingsMgr.GetKustomizeSetNamespaceEnabled()) if err != nil { return fmt.Errorf("error getting kustomize settings options: %w", err) } @@ -686,7 +686,7 @@ func (s *Server) GetManifestsWithFiles(stream application.ApplicationService_Get if err != nil { return fmt.Errorf("error getting kustomize settings: %w", err) } - kustomizeOptions, err := kustomizeSettings.GetOptions(a.Spec.GetSource()) + kustomizeOptions, err := kustomizeSettings.GetOptions(a.Spec.GetSource(), s.settingsMgr.GetKustomizeSetNamespaceEnabled()) if err != nil { return fmt.Errorf("error getting kustomize settings options: %w", err) } @@ -825,7 +825,7 @@ func (s *Server) Get(ctx context.Context, q *application.ApplicationQuery) (*v1a if err != nil { return fmt.Errorf("error getting trackingMethod from settings: %w", err) } - kustomizeOptions, err := kustomizeSettings.GetOptions(a.Spec.GetSource()) + kustomizeOptions, err := kustomizeSettings.GetOptions(a.Spec.GetSource(), s.settingsMgr.GetKustomizeSetNamespaceEnabled()) if err != nil { return fmt.Errorf("error getting kustomize settings options: %w", err) } diff --git a/server/application/application.proto b/server/application/application.proto index 6cbfd77687774..24dffca27bc62 100644 --- a/server/application/application.proto +++ b/server/application/application.proto @@ -19,283 +19,316 @@ import "github.com/argoproj/argo-cd/v3/reposerver/repository/repository.proto"; // you specify one project, the application will only be returned if it exists and belongs to the specified project. // Otherwise you will receive a 404. message ApplicationQuery { - // the application's name - optional string name = 1; - // forces application reconciliation if set to 'hard' - optional string refresh = 2; - // the project names to restrict returned list applications - repeated string projects = 3; - // when specified with a watch call, shows changes that occur after that particular version of a resource. - optional string resourceVersion = 4; - // the selector to restrict returned list to applications only with matched labels - optional string selector = 5; - // the repoURL to restrict returned list applications - optional string repo = 6; - // the application's namespace - optional string appNamespace = 7; - // the project names to restrict returned list applications (legacy name for backwards-compatibility) - repeated string project = 8; + // the application's name + optional string name = 1; + // forces application reconciliation if set to 'hard' + optional string refresh = 2; + // the project names to restrict returned list applications + repeated string projects = 3; + // when specified with a watch call, shows changes that occur after that particular version of a resource. + optional string resourceVersion = 4; + // the selector to restrict returned list to applications only with matched labels + optional string selector = 5; + // the repoURL to restrict returned list applications + optional string repo = 6; + // the application's namespace + optional string appNamespace = 7; + // the project names to restrict returned list applications (legacy name for backwards-compatibility) + repeated string project = 8; } message NodeQuery { - // the application's name - optional string name = 1; - optional string appNamespace = 2; + // the application's name + optional string name = 1; + optional string appNamespace = 2; } message RevisionMetadataQuery{ - // the application's name - required string name = 1; - // the revision of the app - required string revision = 2; - // the application's namespace - optional string appNamespace = 3; - optional string project = 4; - // source index (for multi source apps) - optional int32 sourceIndex = 5; - // versionId from historical data (for multi source apps) - optional int32 versionId = 6; + // the application's name + required string name = 1; + // the revision of the app + required string revision = 2; + // the application's namespace + optional string appNamespace = 3; + optional string project = 4; + // source index (for multi source apps) + optional int32 sourceIndex = 5; + // versionId from historical data (for multi source apps) + optional int32 versionId = 6; } // ApplicationEventsQuery is a query for application resource events message ApplicationResourceEventsQuery { - required string name = 1; - optional string resourceNamespace = 2; - optional string resourceName = 3; - optional string resourceUID = 4; - optional string appNamespace = 5; - optional string project = 6; + required string name = 1; + optional string resourceNamespace = 2; + optional string resourceName = 3; + optional string resourceUID = 4; + optional string appNamespace = 5; + optional string project = 6; } // ManifestQuery is a query for manifest resources message ApplicationManifestQuery { - required string name = 1; - optional string revision = 2; - optional string appNamespace = 3; - optional string project = 4; - repeated int64 sourcePositions = 5; - repeated string revisions = 6; + required string name = 1; + optional string revision = 2; + optional string appNamespace = 3; + optional string project = 4; + repeated int64 sourcePositions = 5; + repeated string revisions = 6; } message FileChunk { - required bytes chunk = 1; + required bytes chunk = 1; } message ApplicationManifestQueryWithFiles { - required string name = 1; - required string checksum = 2; - optional string appNamespace = 3; - optional string project = 4; + required string name = 1; + required string checksum = 2; + optional string appNamespace = 3; + optional string project = 4; } message ApplicationManifestQueryWithFilesWrapper { - oneof part { - ApplicationManifestQueryWithFiles query = 1; - FileChunk chunk = 2; - } + oneof part { + ApplicationManifestQueryWithFiles query = 1; + FileChunk chunk = 2; + } } message ApplicationResponse {} +message ApplicationValidateResponse { + optional string error = 1; + optional string entity = 2; +} + +message ApplicationRolloutRollbackResponse { + required string rollout = 1; + required int64 newRevision = 2; +} + message ApplicationCreateRequest { - required github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.Application application = 1; - optional bool upsert = 2; - optional bool validate = 3; + required github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.Application application = 1; + optional bool upsert = 2; + optional bool validate = 3; } message ApplicationUpdateRequest { - required github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.Application application = 1; - optional bool validate = 2; - optional string project = 3; + required github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.Application application = 1; + optional bool validate = 2; + optional string project = 3; } message ApplicationDeleteRequest { - required string name = 1; - optional bool cascade = 2; - optional string propagationPolicy = 3; - optional string appNamespace = 4; - optional string project = 5; + required string name = 1; + optional bool cascade = 2; + optional string propagationPolicy = 3; + optional string appNamespace = 4; + optional string project = 5; } message SyncOptions { - repeated string items = 1; + repeated string items = 1; } // ApplicationSyncRequest is a request to apply the config state to live state message ApplicationSyncRequest { - required string name = 1; - optional string revision = 2; - optional bool dryRun = 3; - optional bool prune = 4; - optional github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.SyncStrategy strategy = 5; - repeated github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.SyncOperationResource resources = 7; - repeated string manifests = 8; - repeated github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.Info infos = 9; - optional github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.RetryStrategy retryStrategy = 10; - optional SyncOptions syncOptions = 11; - optional string appNamespace = 12; - optional string project = 13; - repeated int64 sourcePositions = 14; - repeated string revisions = 15; + required string name = 1; + optional string revision = 2; + optional bool dryRun = 3; + optional bool prune = 4; + optional github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.SyncStrategy strategy = 5; + repeated github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.SyncOperationResource resources = 7; + repeated string manifests = 8; + repeated github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.Info infos = 9; + optional github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.RetryStrategy retryStrategy = 10; + optional SyncOptions syncOptions = 11; + optional string appNamespace = 12; + optional string project = 13; + repeated int64 sourcePositions = 14; + repeated string revisions = 15; } // ApplicationUpdateSpecRequest is a request to update application spec message ApplicationUpdateSpecRequest { - required string name = 1; - required github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.ApplicationSpec spec = 2; - optional bool validate = 3; - optional string appNamespace = 4; - optional string project = 5; + required string name = 1; + required github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.ApplicationSpec spec = 2; + optional bool validate = 3; + optional string appNamespace = 4; + optional string project = 5; } // ApplicationPatchRequest is a request to patch an application message ApplicationPatchRequest { - required string name = 1; - required string patch = 2; - required string patchType = 3; - optional string appNamespace = 5; - optional string project = 6; + required string name = 1; + required string patch = 2; + required string patchType = 3; + optional string appNamespace = 5; + optional string project = 6; +} + +message ApplicationValidationRequest { + required github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.Application application = 1; +} + +message ApplicationRolloutRollbackRequest { + required string name = 1; + required string namespace = 2; + required string rolloutName = 3; + required string rolloutNamespace = 4; + required int64 rolloutRevision = 5; } message ApplicationRollbackRequest { - required string name = 1; - required int64 id = 2; - optional bool dryRun = 3; - optional bool prune = 4; - optional string appNamespace = 6; - optional string project = 7; + required string name = 1; + required int64 id = 2; + optional bool dryRun = 3; + optional bool prune = 4; + optional string appNamespace = 6; + optional string project = 7; } message ApplicationResourceRequest { - required string name = 1; - optional string namespace = 2; - required string resourceName = 3; - required string version = 4; - optional string group = 5; - required string kind = 6; - optional string appNamespace = 7; - optional string project = 8; + required string name = 1; + optional string namespace = 2; + required string resourceName = 3; + required string version = 4; + optional string group = 5; + required string kind = 6; + optional string appNamespace = 7; + optional string project = 8; } message ApplicationResourcePatchRequest { - required string name = 1; - optional string namespace = 2; - required string resourceName = 3; - required string version = 4; - optional string group = 5; - required string kind = 6; - required string patch = 7; - required string patchType = 8; - optional string appNamespace = 9; - optional string project = 10; + required string name = 1; + optional string namespace = 2; + required string resourceName = 3; + required string version = 4; + optional string group = 5; + required string kind = 6; + required string patch = 7; + required string patchType = 8; + optional string appNamespace = 9; + optional string project = 10; +} + +message ChangeRevisionRequest { + required string appName = 1; + optional string namespace = 2; + optional string currentRevision = 3; + optional string previousRevision = 4; +} + +message ChangeRevisionResponse { + required string revision = 1; } message ApplicationResourceDeleteRequest { - required string name = 1; - optional string namespace = 2; - required string resourceName = 3; - required string version = 4; - optional string group = 5; - required string kind = 6; - optional bool force = 7; - optional bool orphan = 8; - optional string appNamespace = 9; - optional string project = 10; + required string name = 1; + optional string namespace = 2; + required string resourceName = 3; + required string version = 4; + optional string group = 5; + required string kind = 6; + optional bool force = 7; + optional bool orphan = 8; + optional string appNamespace = 9; + optional string project = 10; } message ResourceActionParameters { - required string name = 1; - required string value = 2; + required string name = 1; + required string value = 2; } // ResourceActionRunRequest is a request to run a resource action. // This message is deprecated and replaced by ResourceActionRunRequestV2. message ResourceActionRunRequest { - option deprecated = true; - required string name = 1; - optional string namespace = 2; - required string resourceName = 3; - required string version = 4; - optional string group = 5; - required string kind = 6; - required string action = 7; - optional string appNamespace = 8; - optional string project = 9; + option deprecated = true; + required string name = 1; + optional string namespace = 2; + required string resourceName = 3; + required string version = 4; + optional string group = 5; + required string kind = 6; + required string action = 7; + optional string appNamespace = 8; + optional string project = 9; } message ResourceActionRunRequestV2 { - required string name = 1; - optional string namespace = 2; - required string resourceName = 3; - required string version = 4; - optional string group = 5; - required string kind = 6; - required string action = 7; - optional string appNamespace = 8; - optional string project = 9; - repeated ResourceActionParameters resourceActionParameters = 10; + required string name = 1; + optional string namespace = 2; + required string resourceName = 3; + required string version = 4; + optional string group = 5; + required string kind = 6; + required string action = 7; + optional string appNamespace = 8; + optional string project = 9; + repeated ResourceActionParameters resourceActionParameters = 10; } message ResourceActionsListResponse { - repeated github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.ResourceAction actions = 1; + repeated github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.ResourceAction actions = 1; } message ApplicationResourceResponse { - required string manifest = 1; + required string manifest = 1; } message ApplicationPodLogsQuery { - required string name = 1; - optional string namespace = 2; - optional string podName = 3; - optional string container = 4; - optional int64 sinceSeconds = 5; - optional k8s.io.apimachinery.pkg.apis.meta.v1.Time sinceTime = 6; - optional int64 tailLines = 7; - optional bool follow = 8; - optional string untilTime = 9; - optional string filter = 10; - optional string kind = 11; - optional string group = 12; - optional string resourceName = 13 ; - optional bool previous = 14; - optional string appNamespace = 15; - optional string project = 16; - optional bool matchCase = 17; + required string name = 1; + optional string namespace = 2; + optional string podName = 3; + optional string container = 4; + optional int64 sinceSeconds = 5; + optional k8s.io.apimachinery.pkg.apis.meta.v1.Time sinceTime = 6; + optional int64 tailLines = 7; + optional bool follow = 8; + optional string untilTime = 9; + optional string filter = 10; + optional string kind = 11; + optional string group = 12; + optional string resourceName = 13 ; + optional bool previous = 14; + optional string appNamespace = 15; + optional string project = 16; + optional bool matchCase = 17; } message LogEntry { - required string content = 1; - // deprecated in favor of timeStampStr since meta.v1.Time don't support nano time - required k8s.io.apimachinery.pkg.apis.meta.v1.Time timeStamp = 2; - required bool last = 3; - required string timeStampStr = 4; - required string podName = 5; + required string content = 1; + // deprecated in favor of timeStampStr since meta.v1.Time don't support nano time + required k8s.io.apimachinery.pkg.apis.meta.v1.Time timeStamp = 2; + required bool last = 3; + required string timeStampStr = 4; + required string podName = 5; } message OperationTerminateRequest { - required string name = 1; - optional string appNamespace = 2; - optional string project = 3; + required string name = 1; + optional string appNamespace = 2; + optional string project = 3; } message ApplicationSyncWindowsQuery { - required string name = 1; - optional string appNamespace = 2; - optional string project = 3; + required string name = 1; + optional string appNamespace = 2; + optional string project = 3; } message ApplicationSyncWindowsResponse { - repeated ApplicationSyncWindow activeWindows = 1; - repeated ApplicationSyncWindow assignedWindows = 2; - required bool canSync = 3; + repeated ApplicationSyncWindow activeWindows = 1; + repeated ApplicationSyncWindow assignedWindows = 2; + required bool canSync = 3; } message ApplicationSyncWindow { - required string kind = 1; - required string schedule = 2; - required string duration = 3; - required bool manualSync = 4; + required string kind = 1; + required string schedule = 2; + required string duration = 3; + required bool manualSync = 4; } message OperationTerminateResponse { @@ -303,230 +336,230 @@ message OperationTerminateResponse { message ResourcesQuery { - required string applicationName = 1; + required string applicationName = 1; - optional string namespace = 2; - optional string name = 3; - optional string version = 4; - optional string group = 5; - optional string kind = 6; - optional string appNamespace = 7; - optional string project = 8; + optional string namespace = 2; + optional string name = 3; + optional string version = 4; + optional string group = 5; + optional string kind = 6; + optional string appNamespace = 7; + optional string project = 8; } message ManagedResourcesResponse { - repeated github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.ResourceDiff items = 1; + repeated github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.ResourceDiff items = 1; } message LinkInfo { - required string title = 1; - required string url = 2; - optional string description = 3; - optional string iconClass = 4; + required string title = 1; + required string url = 2; + optional string description = 3; + optional string iconClass = 4; } message LinksResponse { - repeated LinkInfo items = 1; + repeated LinkInfo items = 1; } message ListAppLinksRequest { - required string name = 1; - optional string namespace = 3; - optional string project = 4; + required string name = 1; + optional string namespace = 3; + optional string project = 4; } // ApplicationService service ApplicationService { - // List returns list of applications - rpc List(ApplicationQuery) returns (github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.ApplicationList) { - option (google.api.http).get = "/api/v1/applications"; - } - - // ListResourceEvents returns a list of event resources - rpc ListResourceEvents(ApplicationResourceEventsQuery) returns (k8s.io.api.core.v1.EventList) { - option (google.api.http).get = "/api/v1/applications/{name}/events"; - } - - // Watch returns stream of application change events - rpc Watch(ApplicationQuery) returns (stream github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.ApplicationWatchEvent) { - option (google.api.http).get = "/api/v1/stream/applications"; - } - - // Create creates an application - rpc Create (ApplicationCreateRequest) returns (github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.Application) { - option (google.api.http) = { - post: "/api/v1/applications" - body: "application" - }; - } - - // Get returns an application by name - rpc Get (ApplicationQuery) returns (github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.Application) { - option (google.api.http).get = "/api/v1/applications/{name}"; - } - - // Get returns sync windows of the application - rpc GetApplicationSyncWindows (ApplicationSyncWindowsQuery) returns (ApplicationSyncWindowsResponse) { - option (google.api.http).get = "/api/v1/applications/{name}/syncwindows"; - } - - // Get the meta-data (author, date, tags, message) for a specific revision of the application - rpc RevisionMetadata (RevisionMetadataQuery) returns (github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.RevisionMetadata) { - option (google.api.http).get = "/api/v1/applications/{name}/revisions/{revision}/metadata"; - } - - // Get the chart metadata (description, maintainers, home) for a specific revision of the application - rpc RevisionChartDetails (RevisionMetadataQuery) returns (github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.ChartDetails) { - option (google.api.http).get = "/api/v1/applications/{name}/revisions/{revision}/chartdetails"; - } - - // Get the chart metadata (description, maintainers, home) for a specific revision of the application - rpc GetOCIMetadata (RevisionMetadataQuery) returns (github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.OCIMetadata) { - option (google.api.http).get = "/api/v1/applications/{name}/revisions/{revision}/ocimetadata"; - } - - // GetManifests returns application manifests - rpc GetManifests (ApplicationManifestQuery) returns (repository.ManifestResponse) { - option (google.api.http).get = "/api/v1/applications/{name}/manifests"; - } - - // GetManifestsWithFiles returns application manifests using provided files to generate them - rpc GetManifestsWithFiles (stream ApplicationManifestQueryWithFilesWrapper) returns (repository.ManifestResponse) { - option (google.api.http) = { - post: "/api/v1/applications/manifestsWithFiles" - body: "*" - }; - } - - // Update updates an application - rpc Update(ApplicationUpdateRequest) returns (github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.Application) { - option (google.api.http) = { - put: "/api/v1/applications/{application.metadata.name}" - body: "application" - }; - } - - // UpdateSpec updates an application spec - rpc UpdateSpec(ApplicationUpdateSpecRequest) returns (github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.ApplicationSpec) { - option (google.api.http) = { - put: "/api/v1/applications/{name}/spec" - body: "spec" - }; - } - - // Patch patch an application - rpc Patch(ApplicationPatchRequest) returns (github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.Application) { - option (google.api.http) = { - patch: "/api/v1/applications/{name}" - body: "*" - }; - } - - // Delete deletes an application - rpc Delete(ApplicationDeleteRequest) returns (ApplicationResponse) { - option (google.api.http).delete = "/api/v1/applications/{name}"; - } - - // Sync syncs an application to its target state - rpc Sync(ApplicationSyncRequest) returns (github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.Application) { - option (google.api.http) = { - post: "/api/v1/applications/{name}/sync" - body: "*" - }; - } - - // ManagedResources returns list of managed resources - rpc ManagedResources(ResourcesQuery) returns (ManagedResourcesResponse) { - option (google.api.http).get = "/api/v1/applications/{applicationName}/managed-resources"; - } - - // ResourceTree returns resource tree - rpc ResourceTree(ResourcesQuery) returns (github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.ApplicationTree) { - option (google.api.http).get = "/api/v1/applications/{applicationName}/resource-tree"; - } - - // Watch returns stream of application resource tree - rpc WatchResourceTree(ResourcesQuery) returns (stream github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.ApplicationTree) { - option (google.api.http).get = "/api/v1/stream/applications/{applicationName}/resource-tree"; - } - - // Rollback syncs an application to its target state - rpc Rollback(ApplicationRollbackRequest) returns (github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.Application) { - option (google.api.http) = { - post: "/api/v1/applications/{name}/rollback" - body: "*" - }; - } - - // TerminateOperation terminates the currently running operation - rpc TerminateOperation(OperationTerminateRequest) returns (OperationTerminateResponse) { - option (google.api.http) = { - delete: "/api/v1/applications/{name}/operation"; - }; - } - - // GetResource returns single application resource - rpc GetResource(ApplicationResourceRequest) returns (ApplicationResourceResponse) { - option (google.api.http).get = "/api/v1/applications/{name}/resource"; - } - - // PatchResource patch single application resource - rpc PatchResource(ApplicationResourcePatchRequest) returns (ApplicationResourceResponse) { - option (google.api.http) = { - post: "/api/v1/applications/{name}/resource" - body: "patch" - }; - } - - // ListResourceActions returns list of resource actions - rpc ListResourceActions(ApplicationResourceRequest) returns (ResourceActionsListResponse) { - option (google.api.http).get = "/api/v1/applications/{name}/resource/actions"; - } - - // RunResourceAction runs a resource action - // - // Deprecated: use RunResourceActionV2 instead. This version does not support resource action parameters but is - // maintained for backward compatibility. It will be removed in a future release. - rpc RunResourceAction(ResourceActionRunRequest) returns (ApplicationResponse) { - option deprecated = true; - option (google.api.http) = { - post: "/api/v1/applications/{name}/resource/actions" - body: "action" - }; - } - - // RunResourceActionV2 runs a resource action with parameters - rpc RunResourceActionV2(ResourceActionRunRequestV2) returns (ApplicationResponse) { - option (google.api.http) = { - post: "/api/v1/applications/{name}/resource/actions/v2" - body: "*" - }; - } - - // DeleteResource deletes a single application resource - rpc DeleteResource(ApplicationResourceDeleteRequest) returns (ApplicationResponse) { - option (google.api.http).delete = "/api/v1/applications/{name}/resource"; - } - - // PodLogs returns stream of log entries for the specified pod. Pod - rpc PodLogs(ApplicationPodLogsQuery) returns (stream LogEntry) { - option (google.api.http) = { - get: "/api/v1/applications/{name}/pods/{podName}/logs" - additional_bindings { - get: "/api/v1/applications/{name}/logs" - } - }; - } - - // ListLinks returns the list of all application deep links - rpc ListLinks(ListAppLinksRequest) returns (LinksResponse) { - option (google.api.http).get = "/api/v1/applications/{name}/links"; - } - - // ListResourceLinks returns the list of all resource deep links - rpc ListResourceLinks(ApplicationResourceRequest) returns (LinksResponse) { - option (google.api.http).get = "/api/v1/applications/{name}/resource/links"; - } -} + // List returns list of applications + rpc List(ApplicationQuery) returns (github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.ApplicationList) { + option (google.api.http).get = "/api/v1/applications"; + } + + // ListResourceEvents returns a list of event resources + rpc ListResourceEvents(ApplicationResourceEventsQuery) returns (k8s.io.api.core.v1.EventList) { + option (google.api.http).get = "/api/v1/applications/{name}/events"; + } + + // Watch returns stream of application change events + rpc Watch(ApplicationQuery) returns (stream github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.ApplicationWatchEvent) { + option (google.api.http).get = "/api/v1/stream/applications"; + } + + // Create creates an application + rpc Create (ApplicationCreateRequest) returns (github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.Application) { + option (google.api.http) = { + post: "/api/v1/applications" + body: "application" + }; + } + + // Get returns an application by name + rpc Get (ApplicationQuery) returns (github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.Application) { + option (google.api.http).get = "/api/v1/applications/{name}"; + } + + // Get returns sync windows of the application + rpc GetApplicationSyncWindows (ApplicationSyncWindowsQuery) returns (ApplicationSyncWindowsResponse) { + option (google.api.http).get = "/api/v1/applications/{name}/syncwindows"; + } + + // Get the meta-data (author, date, tags, message) for a specific revision of the application + rpc RevisionMetadata (RevisionMetadataQuery) returns (github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.RevisionMetadata) { + option (google.api.http).get = "/api/v1/applications/{name}/revisions/{revision}/metadata"; + } + + // Get the chart metadata (description, maintainers, home) for a specific revision of the application + rpc RevisionChartDetails (RevisionMetadataQuery) returns (github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.ChartDetails) { + option (google.api.http).get = "/api/v1/applications/{name}/revisions/{revision}/chartdetails"; + } + + // Get the chart metadata (description, maintainers, home) for a specific revision of the application + rpc GetOCIMetadata (RevisionMetadataQuery) returns (github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.OCIMetadata) { + option (google.api.http).get = "/api/v1/applications/{name}/revisions/{revision}/ocimetadata"; + } + + // GetManifests returns application manifests + rpc GetManifests (ApplicationManifestQuery) returns (repository.ManifestResponse) { + option (google.api.http).get = "/api/v1/applications/{name}/manifests"; + } + + // GetManifestsWithFiles returns application manifests using provided files to generate them + rpc GetManifestsWithFiles (stream ApplicationManifestQueryWithFilesWrapper) returns (repository.ManifestResponse) { + option (google.api.http) = { + post: "/api/v1/applications/manifestsWithFiles" + body: "*" + }; + } + + // Update updates an application + rpc Update(ApplicationUpdateRequest) returns (github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.Application) { + option (google.api.http) = { + put: "/api/v1/applications/{application.metadata.name}" + body: "application" + }; + } + + // UpdateSpec updates an application spec + rpc UpdateSpec(ApplicationUpdateSpecRequest) returns (github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.ApplicationSpec) { + option (google.api.http) = { + put: "/api/v1/applications/{name}/spec" + body: "spec" + }; + } + + // Patch patch an application + rpc Patch(ApplicationPatchRequest) returns (github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.Application) { + option (google.api.http) = { + patch: "/api/v1/applications/{name}" + body: "*" + }; + } + + // Delete deletes an application + rpc Delete(ApplicationDeleteRequest) returns (ApplicationResponse) { + option (google.api.http).delete = "/api/v1/applications/{name}"; + } + + // Sync syncs an application to its target state + rpc Sync(ApplicationSyncRequest) returns (github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.Application) { + option (google.api.http) = { + post: "/api/v1/applications/{name}/sync" + body: "*" + }; + } + + // ManagedResources returns list of managed resources + rpc ManagedResources(ResourcesQuery) returns (ManagedResourcesResponse) { + option (google.api.http).get = "/api/v1/applications/{applicationName}/managed-resources"; + } + + // ResourceTree returns resource tree + rpc ResourceTree(ResourcesQuery) returns (github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.ApplicationTree) { + option (google.api.http).get = "/api/v1/applications/{applicationName}/resource-tree"; + } + + // Watch returns stream of application resource tree + rpc WatchResourceTree(ResourcesQuery) returns (stream github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.ApplicationTree) { + option (google.api.http).get = "/api/v1/stream/applications/{applicationName}/resource-tree"; + } + + // Rollback syncs an application to its target state + rpc Rollback(ApplicationRollbackRequest) returns (github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.Application) { + option (google.api.http) = { + post: "/api/v1/applications/{name}/rollback" + body: "*" + }; + } + + // TerminateOperation terminates the currently running operation + rpc TerminateOperation(OperationTerminateRequest) returns (OperationTerminateResponse) { + option (google.api.http) = { + delete: "/api/v1/applications/{name}/operation"; + }; + } + + // GetResource returns single application resource + rpc GetResource(ApplicationResourceRequest) returns (ApplicationResourceResponse) { + option (google.api.http).get = "/api/v1/applications/{name}/resource"; + } + + // PatchResource patch single application resource + rpc PatchResource(ApplicationResourcePatchRequest) returns (ApplicationResourceResponse) { + option (google.api.http) = { + post: "/api/v1/applications/{name}/resource" + body: "patch" + }; + } + + // ListResourceActions returns list of resource actions + rpc ListResourceActions(ApplicationResourceRequest) returns (ResourceActionsListResponse) { + option (google.api.http).get = "/api/v1/applications/{name}/resource/actions"; + } + + // RunResourceAction runs a resource action + // + // Deprecated: use RunResourceActionV2 instead. This version does not support resource action parameters but is + // maintained for backward compatibility. It will be removed in a future release. + rpc RunResourceAction(ResourceActionRunRequest) returns (ApplicationResponse) { + option deprecated = true; + option (google.api.http) = { + post: "/api/v1/applications/{name}/resource/actions" + body: "action" + }; + } + + // RunResourceActionV2 runs a resource action with parameters + rpc RunResourceActionV2(ResourceActionRunRequestV2) returns (ApplicationResponse) { + option (google.api.http) = { + post: "/api/v1/applications/{name}/resource/actions/v2" + body: "*" + }; + } + + // DeleteResource deletes a single application resource + rpc DeleteResource(ApplicationResourceDeleteRequest) returns (ApplicationResponse) { + option (google.api.http).delete = "/api/v1/applications/{name}/resource"; + } + + // PodLogs returns stream of log entries for the specified pod. Pod + rpc PodLogs(ApplicationPodLogsQuery) returns (stream LogEntry) { + option (google.api.http) = { + get: "/api/v1/applications/{name}/pods/{podName}/logs" + additional_bindings { + get: "/api/v1/applications/{name}/logs" + } + }; + } + + // ListLinks returns the list of all application deep links + rpc ListLinks(ListAppLinksRequest) returns (LinksResponse) { + option (google.api.http).get = "/api/v1/applications/{name}/links"; + } + + // ListResourceLinks returns the list of all resource deep links + rpc ListResourceLinks(ApplicationResourceRequest) returns (LinksResponse) { + option (google.api.http).get = "/api/v1/applications/{name}/resource/links"; + } +} \ No newline at end of file diff --git a/server/application/application_rollout_rollback.go b/server/application/application_rollout_rollback.go new file mode 100644 index 0000000000000..be0ffcaba4aa0 --- /dev/null +++ b/server/application/application_rollout_rollback.go @@ -0,0 +1,225 @@ +package application + +import ( + "context" + "encoding/json" + "fmt" + + jsonpatch "github.com/evanphx/json-patch" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + apierrors "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/rest" + + "github.com/argoproj/argo-cd/v3/pkg/apiclient/application" + "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" + "github.com/argoproj/argo-cd/v3/util/resource" +) + +func (s *Server) RollbackApplicationRollout(ctx context.Context, q *application.ApplicationRolloutRollbackRequest) (*application.ApplicationRolloutRollbackResponse, error) { + a, err := s.appLister.Applications(*q.Namespace).Get(q.GetName()) + if err != nil { + return nil, fmt.Errorf("error getting application by name: %w", err) + } + + config, err := s.getApplicationClusterConfig(ctx, a) + if err != nil { + return nil, fmt.Errorf("error getting application(%s) cluster config: %w", a.GetName(), err) + } + + liveRolloutObj, err := s.kubectl.GetResource(ctx, config, getRolloutGVK(), q.GetRolloutName(), q.GetRolloutNamespace()) + if err != nil { + return nil, fmt.Errorf("error getting live state of rollout(%s): %w", q.GetRolloutName(), err) + } + + currentRolloutRevision := resource.GetRevision(liveRolloutObj) + targetRolloutRevision := q.GetRolloutRevision() + newRolloutRevision := currentRolloutRevision + 1 + if targetRolloutRevision == currentRolloutRevision { + return nil, fmt.Errorf("revisions are equal, rollback is redundant: %w", err) + } + if targetRolloutRevision > currentRolloutRevision { + return nil, fmt.Errorf("revision greater than latest(%d): %w", currentRolloutRevision, err) + } + + rs, err := s.getReplicaSetForRolloutRollack(ctx, config, q, a) + if err != nil { + return nil, err + } + + newRolloutObj, err := s.getNewRolloutObjForRollbackPatch(liveRolloutObj, rs) + if err != nil { + return nil, err + } + + _, err = s.patchResourceOnCluster(ctx, config, newRolloutObj, liveRolloutObj) + if err != nil { + return nil, err + } + + return &application.ApplicationRolloutRollbackResponse{ + Rollout: q.RolloutName, + NewRevision: &newRolloutRevision, + }, nil +} + +func (s *Server) getRsOfSpecificRevision(ctx context.Context, config *rest.Config, rollout *v1alpha1.ResourceNode, replicasNodes []v1alpha1.ResourceNode, toRevision int64) (*unstructured.Unstructured, error) { + var ( + latestReplicaSet *unstructured.Unstructured + latestRevision = int64(-1) + previousReplicaSet *unstructured.Unstructured + previousRevision = int64(-1) + ) + for _, rsNode := range replicasNodes { + rsliveObj, err := s.kubectl.GetResource(ctx, config, rsNode.GroupKindVersion(), rsNode.Name, rsNode.Namespace) + if err != nil { + return nil, fmt.Errorf("error getting resource: %w", err) + } + + if v := resource.GetRevision(rsliveObj); err == nil { + if toRevision == 0 { + if latestRevision < v { + // newest one we've seen so far + previousRevision = latestRevision + previousReplicaSet = latestReplicaSet + latestRevision = v + latestReplicaSet = rsliveObj + } else if previousRevision < v { + // second newest one we've seen so far + previousRevision = v + previousReplicaSet = rsliveObj + } + } else if toRevision == v { + return rsliveObj, nil + } + } + } + + if toRevision > 0 { + return nil, fmt.Errorf("unable to find specified revision %v in history", toRevision) + } + + if previousReplicaSet == nil { + return nil, fmt.Errorf("no revision found for rollout %q", rollout.Name) + } + + return previousReplicaSet, nil +} + +func (s *Server) getNewRolloutObjForRollbackPatch(liveRolloutObj *unstructured.Unstructured, rs *unstructured.Unstructured) (*unstructured.Unstructured, error) { + rsSpecTemplate, found, err := unstructured.NestedFieldCopy(rs.Object, "spec", "template") + if !found { + return nil, fmt.Errorf("failed to found replicaset %s - spec/template: %w", rs.GetName(), err) + } + if err != nil { + return nil, fmt.Errorf("failed to copy replicaset %s spec/template: %w", rs.GetName(), err) + } + rsSpecTemplateU := unstructured.Unstructured{ + Object: rsSpecTemplate.(map[string]any), + } + unstructured.RemoveNestedField(rsSpecTemplateU.Object, "metadata", "labels", "rollouts-pod-template-hash") + newRolloutObj := liveRolloutObj.DeepCopy() + err = unstructured.SetNestedField(newRolloutObj.Object, rsSpecTemplateU.Object, "spec", "template") + if err != nil { + return nil, fmt.Errorf("failed to set spec/template of rollout %s: %w", liveRolloutObj.GetName(), err) + } + + return newRolloutObj, nil +} + +func (s *Server) getReplicaSetForRolloutRollack(ctx context.Context, config *rest.Config, q *application.ApplicationRolloutRollbackRequest, a *v1alpha1.Application) (*unstructured.Unstructured, error) { + tree, err := s.getAppResources(ctx, a) + if err != nil { + return nil, fmt.Errorf("error getting app resources: %w", err) + } + + rolloutGVK := getRolloutGVK() + + foundRolloutNode := tree.FindNode(rolloutGVK.Group, rolloutGVK.Kind, q.GetRolloutNamespace(), q.GetRolloutName()) + if foundRolloutNode == nil || foundRolloutNode.ResourceRef.UID == "" { + return nil, status.Errorf(codes.InvalidArgument, "%s %s %s not found as part of application %s", rolloutGVK.Kind, rolloutGVK.Group, q.GetRolloutName(), q.GetName()) + } + + childReplicaSets := foundRolloutNode.GetAllChildNodes(tree, "ReplicaSet") + + if len(childReplicaSets) == 0 { + return nil, fmt.Errorf("no related replicasets found for rollout %s: %w", q.GetRolloutName(), err) + } + + rs, err := s.getRsOfSpecificRevision(ctx, config, foundRolloutNode, childReplicaSets, q.GetRolloutRevision()) + if rs == nil { + return nil, fmt.Errorf("no related replicaset of revision %d was found for rollout %s: %w", q.GetRolloutRevision(), q.GetRolloutName(), err) + } + if err != nil { + return nil, err + } + + return rs, nil +} + +func getRolloutGVK() schema.GroupVersionKind { + return schema.GroupVersionKind{ + Group: "argoproj.io", + Version: "v1alpha1", + Kind: "Rollout", + } +} + +// lagic taken from ./application.go - RunResourceAction +func (s *Server) patchResourceOnCluster(ctx context.Context, config *rest.Config, newObj *unstructured.Unstructured, liveObj *unstructured.Unstructured) (*unstructured.Unstructured, error) { + newObjBytes, err := json.Marshal(newObj) + if err != nil { + return nil, fmt.Errorf("error marshaling new object: %w", err) + } + + liveObjBytes, err := json.Marshal(liveObj) + if err != nil { + return nil, fmt.Errorf("error marshaling live object: %w", err) + } + + diffBytes, err := jsonpatch.CreateMergePatch(liveObjBytes, newObjBytes) + if err != nil { + return nil, fmt.Errorf("error calculating merge patch: %w", err) + } + if string(diffBytes) == "{}" { + return nil, nil + } + + // The following logic detects if the resource action makes a modification to status and/or spec. + // If status was modified, we attempt to patch the status using status subresource, in case the + // CRD is configured using the status subresource feature. See: + // https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/#status-subresource + // If status subresource is in use, the patch has to be split into two: + // * one to update spec (and other non-status fields) + // * the other to update only status. + nonStatusPatch, statusPatch, err := splitStatusPatch(diffBytes) + if err != nil { + return nil, fmt.Errorf("error splitting status patch: %w", err) + } + if statusPatch != nil { + _, err = s.kubectl.PatchResource(ctx, config, newObj.GroupVersionKind(), newObj.GetName(), newObj.GetNamespace(), types.MergePatchType, diffBytes, "status") + if err != nil { + if !apierrors.IsNotFound(err) { + return nil, fmt.Errorf("error patching resource: %w", err) + } + // K8s API server returns 404 NotFound when the CRD does not support the status subresource + // if we get here, the CRD does not use the status subresource. We will fall back to a normal patch + } else { + // If we get here, the CRD does use the status subresource, so we must patch status and + // spec separately. update the diffBytes to the spec-only patch and fall through. + diffBytes = nonStatusPatch + } + } + if diffBytes != nil { + result, err := s.kubectl.PatchResource(ctx, config, newObj.GroupVersionKind(), newObj.GetName(), newObj.GetNamespace(), types.MergePatchType, diffBytes) + if err != nil { + return nil, fmt.Errorf("error patching resource: %w", err) + } + + return result, nil + } + return nil, nil +} diff --git a/server/application/application_validate_src_and_dest.go b/server/application/application_validate_src_and_dest.go new file mode 100644 index 0000000000000..87fb2ddb137e4 --- /dev/null +++ b/server/application/application_validate_src_and_dest.go @@ -0,0 +1,94 @@ +package application + +import ( + "context" + "errors" + "fmt" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + apierrors "k8s.io/apimachinery/pkg/api/errors" + + "github.com/argoproj/argo-cd/v3/pkg/apiclient/application" + appv1 "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" + applisters "github.com/argoproj/argo-cd/v3/pkg/client/listers/application/v1alpha1" + "github.com/argoproj/argo-cd/v3/util/argo" + "github.com/argoproj/argo-cd/v3/util/db" +) + +func (s *Server) ValidateSrcAndDst(ctx context.Context, requset *application.ApplicationValidationRequest) (*application.ApplicationValidateResponse, error) { + app := requset.Application + proj, err := argo.GetAppProject(ctx, app, applisters.NewAppProjectLister(s.projInformer.GetIndexer()), s.ns, s.settingsMgr, s.db) + if err != nil { + entity := projectEntity + if apierrors.IsNotFound(err) { + errMsg := fmt.Sprintf("application references project %s which does not exist", app.Spec.Project) + return &application.ApplicationValidateResponse{ + Error: &errMsg, + Entity: &entity, + }, nil + } + errMsg := err.Error() + return &application.ApplicationValidateResponse{ + Error: &errMsg, + Entity: &entity, + }, nil + } + + if err := validateDestination(ctx, &app.Spec.Destination, s.db); err != nil { + entity := destinationEntity + errMsg := fmt.Sprintf("application destination spec for %s is invalid: %s", app.ObjectMeta.Name, err.Error()) + return &application.ApplicationValidateResponse{ + Error: &errMsg, + Entity: &entity, + }, nil + } + var conditions []appv1.ApplicationCondition + conditions, err = argo.ValidateRepo(ctx, app, s.repoClientset, s.db, s.kubectl, proj, s.settingsMgr) + if err != nil { + entity := sourceEntity + errMsg := err.Error() + return &application.ApplicationValidateResponse{ + Error: &errMsg, + Entity: &entity, + }, nil + } + if len(conditions) > 0 { + entity := sourceEntity + errMsg := fmt.Sprintf("application spec for %s is invalid: %s", app.ObjectMeta.Name, argo.FormatAppConditions(conditions)) + return &application.ApplicationValidateResponse{ + Error: &errMsg, + Entity: &entity, + }, nil + } + return &application.ApplicationValidateResponse{ + Error: nil, + Entity: nil, + }, nil +} + +// validates destination name (argo.ValidateDestination) and server with extra logic +func validateDestination(ctx context.Context, dest *appv1.ApplicationDestination, db db.ArgoDB) error { + if dest == nil { + return errors.New("no destination defined in app spec") + } + _, err := argo.GetDestinationCluster(ctx, *dest, db) + if err != nil { + return err + } + + if dest.Server != "" { + // Ensure the k8s cluster the app is referencing, is configured in Argo CD + _, err := db.GetCluster(ctx, dest.Server) + if err != nil { + if errStatus, ok := status.FromError(err); ok && errStatus.Code() == codes.NotFound { + return fmt.Errorf("cluster '%s' has not been configured", dest.Server) + } + return err + } + } else if dest.Server == "" { + return errors.New("destination server missing from app spec") + } + + return nil +} diff --git a/server/application/cf_application.go b/server/application/cf_application.go new file mode 100644 index 0000000000000..7f6785885539b --- /dev/null +++ b/server/application/cf_application.go @@ -0,0 +1,61 @@ +package application + +import ( + "context" + "fmt" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "k8s.io/utils/ptr" + + "github.com/argoproj/argo-cd/v3/pkg/apiclient/application" + appv1 "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" + "github.com/argoproj/argo-cd/v3/reposerver/apiclient" + "github.com/argoproj/argo-cd/v3/util/app/path" + ioutil "github.com/argoproj/argo-cd/v3/util/io" +) + +const ( + projectEntity = "project" + sourceEntity = "source" + destinationEntity = "destination" +) + +func (s *Server) GetChangeRevision(ctx context.Context, in *application.ChangeRevisionRequest) (*application.ChangeRevisionResponse, error) { + app, err := s.appLister.Applications(in.GetNamespace()).Get(in.GetAppName()) + if err != nil { + return nil, err + } + + val, ok := app.Annotations[appv1.AnnotationKeyManifestGeneratePaths] + if !ok || val == "" { + return nil, status.Errorf(codes.FailedPrecondition, "manifest generation paths not set") + } + + repo, err := s.db.GetRepository(ctx, app.Spec.GetSource().RepoURL, app.Spec.Project) + if err != nil { + return nil, fmt.Errorf("error getting repository: %w", err) + } + + closer, client, err := s.repoClientset.NewRepoServerClient() + if err != nil { + return nil, fmt.Errorf("error creating repo server client: %w", err) + } + defer ioutil.Close(closer) + + response, err := client.GetChangeRevision(ctx, &apiclient.ChangeRevisionRequest{ + AppName: in.GetAppName(), + Namespace: in.GetNamespace(), + CurrentRevision: in.GetCurrentRevision(), + PreviousRevision: in.GetPreviousRevision(), + Paths: path.GetAppRefreshPaths(app), + Repo: repo, + }) + if err != nil { + return nil, fmt.Errorf("error getting change revision: %w", err) + } + + return &application.ChangeRevisionResponse{ + Revision: ptr.To(response.Revision), + }, nil +} diff --git a/server/repository/repository.go b/server/repository/repository.go index 6d1a60e6dafde..9a96952f47b16 100644 --- a/server/repository/repository.go +++ b/server/repository/repository.go @@ -382,7 +382,7 @@ func (s *Server) GetAppDetails(ctx context.Context, q *repositorypkg.RepoAppDeta if err != nil { return nil, err } - kustomizeOptions, err := kustomizeSettings.GetOptions(*q.Source) + kustomizeOptions, err := kustomizeSettings.GetOptions(*q.Source, s.settings.GetKustomizeSetNamespaceEnabled()) if err != nil { return nil, err } diff --git a/sonar-project.properties b/sonar-project.properties index 21dad92e68837..642c77ece214c 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -1,15 +1,15 @@ -sonar.projectKey=argoproj_argo-cd -sonar.organization=argoproj +sonar.projectKey=argo-cd +sonar.organization=codefresh-io # This is the name and version displayed in the SonarCloud UI. sonar.projectName=argo-cd sonar.projectVersion=1.0 - + # Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows. sonar.sources=. sonar.exclusions=docs/** - + # Encoding of the source code. Default is default system encoding sonar.sourceEncoding=UTF-8 diff --git a/test/e2e/app_management_ns_test.go b/test/e2e/app_management_ns_test.go index f28ede2660c7b..8908499fb19d4 100644 --- a/test/e2e/app_management_ns_test.go +++ b/test/e2e/app_management_ns_test.go @@ -429,6 +429,7 @@ func TestNamespacedTrackAppStateAndSyncApp(t *testing.T) { When(). CreateApp(). Sync(). + Wait(). Then(). Expect(OperationPhaseIs(OperationSucceeded)). Expect(SyncStatusIs(SyncStatusCodeSynced)). @@ -1134,6 +1135,7 @@ func TestNamespacedPermissions(t *testing.T) { }). CreateApp(). Sync(). + Wait(). Then(). // make sure application resource actiions are successful And(func(app *Application) { diff --git a/test/e2e/app_management_test.go b/test/e2e/app_management_test.go index 6d4ff14849965..c7b38d5a54918 100644 --- a/test/e2e/app_management_test.go +++ b/test/e2e/app_management_test.go @@ -576,6 +576,7 @@ func TestTrackAppStateAndSyncApp(t *testing.T) { When(). CreateApp(). Sync(). + Wait(). Then(). Expect(OperationPhaseIs(OperationSucceeded)). Expect(SyncStatusIs(SyncStatusCodeSynced)). @@ -1175,6 +1176,7 @@ func TestNewStyleResourceActionPermitted(t *testing.T) { When(). CreateApp(). Sync(). + Wait(). Then(). And(func(app *Application) { closer, client, err := fixture.ArgoCDClientset.NewApplicationClient() @@ -1287,6 +1289,7 @@ func TestNewStyleResourceActionMixedOk(t *testing.T) { When(). CreateApp(). Sync(). + Wait(). Then(). And(func(app *Application) { closer, client, err := fixture.ArgoCDClientset.NewApplicationClient() diff --git a/test/e2e/fixture/app/expectation.go b/test/e2e/fixture/app/expectation.go index 56cf7f32e6d80..8c2f78a5b07f1 100644 --- a/test/e2e/fixture/app/expectation.go +++ b/test/e2e/fixture/app/expectation.go @@ -343,7 +343,7 @@ func Success(message string, matchers ...func(string, string) bool) Expectation return failed, "error" } if !match(c.actions.lastOutput, message) { - return failed, fmt.Sprintf("output did not contain '%s'", message) + return failed, fmt.Sprintf("output did not contain '%s', but got: '%s'", message, c.actions.lastOutput) } return succeeded, fmt.Sprintf("no error and output contained '%s'", message) } diff --git a/test/e2e/project_management_test.go b/test/e2e/project_management_test.go index e5b206c56c7ea..22f022445c364 100644 --- a/test/e2e/project_management_test.go +++ b/test/e2e/project_management_test.go @@ -533,6 +533,8 @@ func TestGetVirtualProjectNoMatch(t *testing.T) { "--path", guestbookPath, "--project", proj.Name, "--dest-server", v1alpha1.KubernetesInternalAPIServerAddr, "--dest-namespace", fixture.DeploymentNamespace()) require.NoError(t, err) + time.Sleep(1 * time.Second) + // App trying to sync a resource which is not blacked listed anywhere _, err = fixture.RunCli("app", "sync", fixture.Name(), "--resource", "apps:Deployment:guestbook-ui", "--timeout", strconv.Itoa(10)) require.NoError(t, err) @@ -569,6 +571,8 @@ func TestGetVirtualProjectMatch(t *testing.T) { "--path", guestbookPath, "--project", proj.Name, "--dest-server", v1alpha1.KubernetesInternalAPIServerAddr, "--dest-namespace", fixture.DeploymentNamespace()) require.NoError(t, err) + time.Sleep(1 * time.Second) + // App trying to sync a resource which is not blacked listed anywhere _, err = fixture.RunCli("app", "sync", fixture.Name(), "--resource", "apps:Deployment:guestbook-ui", "--timeout", strconv.Itoa(10)) require.ErrorContains(t, err, "blocked by sync window") diff --git a/test/e2e/testdata/helm-with-multiple-dependencies/Chart.yaml b/test/e2e/testdata/helm-with-multiple-dependencies/Chart.yaml index f7f144d20e123..fc1982761746c 100644 --- a/test/e2e/testdata/helm-with-multiple-dependencies/Chart.yaml +++ b/test/e2e/testdata/helm-with-multiple-dependencies/Chart.yaml @@ -1,11 +1,7 @@ apiVersion: v2 -name: helm-with-multiple-dependencies +name: helm-with-dependencies version: v1.0.0 dependencies: - name: helm repository: "https://localhost:9444/argo-e2e/testdata.git/helm-repo/local" version: v1.0.0 - - name: helm - repository: "https://localhost:9444/argo-e2e/testdata.git/helm-repo/local2" - version: v1.0.0 - alias: helm2 \ No newline at end of file diff --git a/util/argo/argo.go b/util/argo/argo.go index 9bcc931ac0c2f..3d238687c4c7c 100644 --- a/util/argo/argo.go +++ b/util/argo/argo.go @@ -773,7 +773,7 @@ func verifyGenerateManifests( }) continue } - kustomizeOptions, err := kustomizeSettings.GetOptions(source) + kustomizeOptions, err := kustomizeSettings.GetOptions(source, settingsMgr.GetKustomizeSetNamespaceEnabled()) if err != nil { conditions = append(conditions, argoappv1.ApplicationCondition{ Type: argoappv1.ApplicationConditionInvalidSpecError, diff --git a/util/git/cf_client.go b/util/git/cf_client.go new file mode 100644 index 0000000000000..41e9c00a45c84 --- /dev/null +++ b/util/git/cf_client.go @@ -0,0 +1,46 @@ +package git + +import ( + "errors" + "fmt" + "strings" +) + +func (m *nativeGitClient) ListRevisions(revision string, targetRevision string) ([]string, error) { + // it happens when app just created and there is no revision yet + if revision == "" { + return []string{targetRevision}, nil + } + + if !IsCommitSHA(revision) || !IsCommitSHA(targetRevision) { + return nil, errors.New("invalid revision provided, must be SHA") + } + + if revision == targetRevision { + return []string{revision}, nil + } + + out, err := m.runCmd("rev-list", "--ancestry-path", fmt.Sprintf("%s..%s", revision, targetRevision)) + if err != nil { + return nil, err + } + ss := strings.Split(out, "\n") + return ss, nil +} + +func (m *nativeGitClient) DiffTree(targetRevision string) ([]string, error) { + if !IsCommitSHA(targetRevision) { + return []string{}, errors.New("invalid revision provided, must be SHA") + } + out, err := m.runCmd("diff-tree", "--no-commit-id", "--name-only", "-r", targetRevision) + if err != nil { + return nil, fmt.Errorf("failed to diff %s: %w", targetRevision, err) + } + + if out == "" { + return []string{}, nil + } + + files := strings.Split(out, "\n") + return files, nil +} diff --git a/util/git/client.go b/util/git/client.go index 557dc584488bd..57fbb3f8f4178 100644 --- a/util/git/client.go +++ b/util/git/client.go @@ -132,6 +132,8 @@ type Client interface { RemoveContents() (string, error) // CommitAndPush commits and pushes changes to the target branch. CommitAndPush(branch, message string) (string, error) + ListRevisions(revision string, targetRevision string) ([]string, error) + DiffTree(targetRevision string) ([]string, error) } type EventHandlers struct { diff --git a/util/git/mocks/Client.go b/util/git/mocks/Client.go index a294d66123de0..7bec1e44a7b3f 100644 --- a/util/git/mocks/Client.go +++ b/util/git/mocks/Client.go @@ -427,6 +427,68 @@ func (_c *Client_CommitSHA_Call) RunAndReturn(run func() (string, error)) *Clien return _c } +// DiffTree provides a mock function for the type Client +func (_mock *Client) DiffTree(targetRevision string) ([]string, error) { + ret := _mock.Called(targetRevision) + + if len(ret) == 0 { + panic("no return value specified for DiffTree") + } + + var r0 []string + var r1 error + if returnFunc, ok := ret.Get(0).(func(string) ([]string, error)); ok { + return returnFunc(targetRevision) + } + if returnFunc, ok := ret.Get(0).(func(string) []string); ok { + r0 = returnFunc(targetRevision) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]string) + } + } + if returnFunc, ok := ret.Get(1).(func(string) error); ok { + r1 = returnFunc(targetRevision) + } else { + r1 = ret.Error(1) + } + return r0, r1 +} + +// Client_DiffTree_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DiffTree' +type Client_DiffTree_Call struct { + *mock.Call +} + +// DiffTree is a helper method to define mock.On call +// - targetRevision string +func (_e *Client_Expecter) DiffTree(targetRevision interface{}) *Client_DiffTree_Call { + return &Client_DiffTree_Call{Call: _e.mock.On("DiffTree", targetRevision)} +} + +func (_c *Client_DiffTree_Call) Run(run func(targetRevision string)) *Client_DiffTree_Call { + _c.Call.Run(func(args mock.Arguments) { + var arg0 string + if args[0] != nil { + arg0 = args[0].(string) + } + run( + arg0, + ) + }) + return _c +} + +func (_c *Client_DiffTree_Call) Return(strings []string, err error) *Client_DiffTree_Call { + _c.Call.Return(strings, err) + return _c +} + +func (_c *Client_DiffTree_Call) RunAndReturn(run func(targetRevision string) ([]string, error)) *Client_DiffTree_Call { + _c.Call.Return(run) + return _c +} + // Fetch provides a mock function for the type Client func (_mock *Client) Fetch(revision string) error { ret := _mock.Called(revision) @@ -624,6 +686,74 @@ func (_c *Client_IsRevisionPresent_Call) RunAndReturn(run func(revision string) return _c } +// ListRevisions provides a mock function for the type Client +func (_mock *Client) ListRevisions(revision string, targetRevision string) ([]string, error) { + ret := _mock.Called(revision, targetRevision) + + if len(ret) == 0 { + panic("no return value specified for ListRevisions") + } + + var r0 []string + var r1 error + if returnFunc, ok := ret.Get(0).(func(string, string) ([]string, error)); ok { + return returnFunc(revision, targetRevision) + } + if returnFunc, ok := ret.Get(0).(func(string, string) []string); ok { + r0 = returnFunc(revision, targetRevision) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]string) + } + } + if returnFunc, ok := ret.Get(1).(func(string, string) error); ok { + r1 = returnFunc(revision, targetRevision) + } else { + r1 = ret.Error(1) + } + return r0, r1 +} + +// Client_ListRevisions_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ListRevisions' +type Client_ListRevisions_Call struct { + *mock.Call +} + +// ListRevisions is a helper method to define mock.On call +// - revision string +// - targetRevision string +func (_e *Client_Expecter) ListRevisions(revision interface{}, targetRevision interface{}) *Client_ListRevisions_Call { + return &Client_ListRevisions_Call{Call: _e.mock.On("ListRevisions", revision, targetRevision)} +} + +func (_c *Client_ListRevisions_Call) Run(run func(revision string, targetRevision string)) *Client_ListRevisions_Call { + _c.Call.Run(func(args mock.Arguments) { + var arg0 string + if args[0] != nil { + arg0 = args[0].(string) + } + var arg1 string + if args[1] != nil { + arg1 = args[1].(string) + } + run( + arg0, + arg1, + ) + }) + return _c +} + +func (_c *Client_ListRevisions_Call) Return(strings []string, err error) *Client_ListRevisions_Call { + _c.Call.Return(strings, err) + return _c +} + +func (_c *Client_ListRevisions_Call) RunAndReturn(run func(revision string, targetRevision string) ([]string, error)) *Client_ListRevisions_Call { + _c.Call.Return(run) + return _c +} + // LsFiles provides a mock function for the type Client func (_mock *Client) LsFiles(path string, enableNewGitFileGlobbing bool) ([]string, error) { ret := _mock.Called(path, enableNewGitFileGlobbing) diff --git a/util/kustomize/cf_kustomize.go b/util/kustomize/cf_kustomize.go new file mode 100644 index 0000000000000..027ca52cfa935 --- /dev/null +++ b/util/kustomize/cf_kustomize.go @@ -0,0 +1,60 @@ +package kustomize + +import ( + "fmt" + "net/url" + "strings" + + log "github.com/sirupsen/logrus" + + "github.com/argoproj/argo-cd/v3/util/git" + + "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" +) + +type ResolveRevisionFunc func(repo, revision string, creds git.Creds) (string, error) + +func (k *kustomize) GetCacheKeyWithComponents(revision string, source *v1alpha1.ApplicationSourceKustomize, resolveRevisionFunc ResolveRevisionFunc) (string, error) { + cacheKey := "" + + revisionsToResolve := map[string]string{} + + for _, c := range source.Components { + _, err := url.Parse(c) + if err != nil { + continue // local files are not part of the cache key + } + + _, _, path, ref := parseGitURL(c) + if ref == "" { + ref = "HEAD" + } + + cleanRepoURL := c + if path != "" { + suffixToTrim := c + if searchedValueIndex := strings.Index(c, path); searchedValueIndex != -1 { + suffixToTrim = c[:searchedValueIndex] + } + cleanRepoURL = strings.TrimSuffix(suffixToTrim, "/") + } + + revisionsToResolve[cleanRepoURL] = ref + } + + for component, ref := range revisionsToResolve { + rev, err := resolveRevisionFunc(component, ref, k.creds) + if err != nil { + log.WithError(err). + WithField("url", component). + Warn("failed to resolve revision of component from url, ignoring in cache key") + continue + } + if cacheKey != "" { + cacheKey += "|" + } + cacheKey += fmt.Sprintf("%s|%s", component, rev) + } + + return fmt.Sprintf("%s|%s", revision, cacheKey), nil +} diff --git a/util/kustomize/kustomize.go b/util/kustomize/kustomize.go index b07f54ddebd05..ed73e8847d804 100644 --- a/util/kustomize/kustomize.go +++ b/util/kustomize/kustomize.go @@ -39,7 +39,12 @@ type BuildOpts struct { // Kustomize provides wrapper functionality around the `kustomize` command. type Kustomize interface { // Build returns a list of unstructured objects from a `kustomize build` command and extract supported parameters - Build(opts *v1alpha1.ApplicationSourceKustomize, kustomizeOptions *v1alpha1.KustomizeOptions, envVars *v1alpha1.Env, buildOpts *BuildOpts) ([]*unstructured.Unstructured, []Image, []string, error) + Build(opts *v1alpha1.ApplicationSourceKustomize, kustomizeOptions *v1alpha1.KustomizeOptions, envVars *v1alpha1.Env, buildOpts *BuildOpts, namespace string) ([]*unstructured.Unstructured, []Image, []string, error) + // Codefresh-fix + // GetCacheKeyWithComponents returns a cache key that takes remote components repositories in consideration and + // not just the repository that contains the base Kustomization file. This is required if we want to rebuild the + // manifests everytime one of the component repositories change and not wait for a hard refresh. + GetCacheKeyWithComponents(revision string, source *v1alpha1.ApplicationSourceKustomize, resolveRevisionFunc ResolveRevisionFunc) (string, error) } // NewKustomizeApp create a new wrapper to run commands on the `kustomize` command-line tool. @@ -124,7 +129,7 @@ func mapToEditAddArgs(val map[string]string) []string { return args } -func (k *kustomize) Build(opts *v1alpha1.ApplicationSourceKustomize, kustomizeOptions *v1alpha1.KustomizeOptions, envVars *v1alpha1.Env, buildOpts *BuildOpts) ([]*unstructured.Unstructured, []Image, []string, error) { +func (k *kustomize) Build(opts *v1alpha1.ApplicationSourceKustomize, kustomizeOptions *v1alpha1.KustomizeOptions, envVars *v1alpha1.Env, buildOpts *BuildOpts, namespace string) ([]*unstructured.Unstructured, []Image, []string, error) { // commands stores all the commands that were run as part of this build. var commands []string @@ -163,6 +168,15 @@ func (k *kustomize) Build(opts *v1alpha1.ApplicationSourceKustomize, kustomizeOp env = append(env, environ...) + if kustomizeOptions != nil && kustomizeOptions.SetNamespace && namespace != "" { + cmd := exec.Command(k.getBinaryPath(), "edit", "set", "namespace", "--", namespace) + cmd.Dir = k.path + _, err := executil.Run(cmd) + if err != nil { + return nil, nil, nil, err + } + } + if opts != nil { if opts.NamePrefix != "" { cmd := exec.Command(k.getBinaryPath(), "edit", "set", "nameprefix", "--", opts.NamePrefix) diff --git a/util/kustomize/kustomize_test.go b/util/kustomize/kustomize_test.go index a0c8ab0bb52a4..e004cd4360403 100644 --- a/util/kustomize/kustomize_test.go +++ b/util/kustomize/kustomize_test.go @@ -75,7 +75,7 @@ func TestKustomizeBuild(t *testing.T) { } objs, images, _, err := kustomize.Build(&kustomizeSource, nil, env, &BuildOpts{ KubeVersion: "1.27", APIVersions: []string{"foo", "bar"}, - }) + }, "") require.NoError(t, err) if err != nil { assert.Len(t, objs, 2) @@ -137,7 +137,7 @@ func TestFailKustomizeBuild(t *testing.T) { }, }, } - _, _, _, err = kustomize.Build(&kustomizeSource, nil, nil, nil) + _, _, _, err = kustomize.Build(&kustomizeSource, nil, nil, nil, "") assert.EqualError(t, err, "expected integer value for count. Received: garbage") } @@ -238,7 +238,7 @@ func TestKustomizeBuildForceCommonLabels(t *testing.T) { appPath, err := testDataDir(t, tc.TestData) require.NoError(t, err) kustomize := NewKustomizeApp(appPath, appPath, git.NopCreds{}, "", "", "", "") - objs, _, _, err := kustomize.Build(&tc.KustomizeSource, nil, tc.Env, nil) + objs, _, _, err := kustomize.Build(&tc.KustomizeSource, nil, tc.Env, nil, "") switch tc.ExpectErr { case true: require.Error(t, err) @@ -330,7 +330,7 @@ func TestKustomizeBuildForceCommonAnnotations(t *testing.T) { appPath, err := testDataDir(t, tc.TestData) require.NoError(t, err) kustomize := NewKustomizeApp(appPath, appPath, git.NopCreds{}, "", "", "", "") - objs, _, _, err := kustomize.Build(&tc.KustomizeSource, nil, tc.Env, nil) + objs, _, _, err := kustomize.Build(&tc.KustomizeSource, nil, tc.Env, nil, "") switch tc.ExpectErr { case true: require.Error(t, err) @@ -436,7 +436,7 @@ func TestKustomizeLabelWithoutSelector(t *testing.T) { appPath, err := testDataDir(t, tc.TestData) require.NoError(t, err) kustomize := NewKustomizeApp(appPath, appPath, git.NopCreds{}, "", "", "", "") - objs, _, _, err := kustomize.Build(&tc.KustomizeSource, nil, tc.Env, nil) + objs, _, _, err := kustomize.Build(&tc.KustomizeSource, nil, tc.Env, nil, "") switch tc.ExpectErr { case true: @@ -472,7 +472,7 @@ func TestKustomizeCustomVersion(t *testing.T) { env := &v1alpha1.Env{ &v1alpha1.EnvEntry{Name: "ARGOCD_APP_NAME", Value: "argo-cd-tests"}, } - objs, images, _, err := kustomize.Build(&kustomizeSource, nil, env, nil) + objs, images, _, err := kustomize.Build(&kustomizeSource, nil, env, nil, "") require.NoError(t, err) if err != nil { assert.Len(t, objs, 2) @@ -493,14 +493,14 @@ func TestKustomizeBuildComponents(t *testing.T) { Components: []string{"./components", "./missing-components"}, IgnoreMissingComponents: false, } - _, _, _, err = kustomize.Build(&kustomizeSource, nil, nil, nil) + _, _, _, err = kustomize.Build(&kustomizeSource, nil, nil, nil, "") require.Error(t, err) kustomizeSource = v1alpha1.ApplicationSourceKustomize{ Components: []string{"./components", "./missing-components"}, IgnoreMissingComponents: true, } - objs, _, _, err := kustomize.Build(&kustomizeSource, nil, nil, nil) + objs, _, _, err := kustomize.Build(&kustomizeSource, nil, nil, nil, "") require.NoError(t, err) obj := objs[0] assert.Equal(t, "nginx-deployment", obj.GetName()) @@ -558,7 +558,7 @@ func TestKustomizeBuildPatches(t *testing.T) { }, }, } - objs, _, _, err := kustomize.Build(&kustomizeSource, nil, nil, nil) + objs, _, _, err := kustomize.Build(&kustomizeSource, nil, nil, nil, "") require.NoError(t, err) obj := objs[0] containers, found, err := unstructured.NestedSlice(obj.Object, "spec", "template", "spec", "containers") @@ -611,7 +611,7 @@ func TestFailKustomizeBuildPatches(t *testing.T) { }, } - _, _, _, err = kustomize.Build(&kustomizeSource, nil, nil, nil) + _, _, _, err = kustomize.Build(&kustomizeSource, nil, nil, nil, "") require.EqualError(t, err, "kustomization file not found in the path") } diff --git a/util/kustomize/repospec.go b/util/kustomize/repospec.go new file mode 100644 index 0000000000000..839483795ee86 --- /dev/null +++ b/util/kustomize/repospec.go @@ -0,0 +1,151 @@ +// The following file was copied from https://github.com/kubernetes-sigs/kustomize/blob/master/api/internal/git/repospec.go +// and modified to expose the ParseGitUrl function +// +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 +package kustomize + +import ( + "net/url" + "strings" +) + +const ( + gitSuffix = ".git" + gitDelimiter = "_git/" +) + +// From strings like git@github.com:someOrg/someRepo.git or +// https://github.com/someOrg/someRepo?ref=someHash, extract +// the parts. +func parseGitURL(n string) ( + host string, orgRepo string, path string, gitRef string, +) { + if strings.Contains(n, gitDelimiter) { + index := strings.Index(n, gitDelimiter) + // Adding _git/ to host + host = normalizeGitHostSpec(n[:index+len(gitDelimiter)]) + orgRepo = strings.Split(strings.Split(n[index+len(gitDelimiter):], "/")[0], "?")[0] + path, gitRef = peelQuery(n[index+len(gitDelimiter)+len(orgRepo):]) + return + } + host, n = parseHostSpec(n) + if strings.Contains(n, gitSuffix) { + index := strings.Index(n, gitSuffix) + orgRepo = n[0:index] + n = n[index+len(gitSuffix):] + if len(n) > 0 && n[0] == '/' { + n = n[1:] + } + path, gitRef = peelQuery(n) + return + } + + i := strings.Index(n, "/") + if i < 1 { + path, gitRef = peelQuery(n) + return + } + j := strings.Index(n[i+1:], "/") + if j >= 0 { + j += i + 1 + orgRepo = n[:j] + path, gitRef = peelQuery(n[j+1:]) + return + } + path = "" + orgRepo, gitRef = peelQuery(n) + return host, orgRepo, path, gitRef +} + +func peelQuery(arg string) (string, string) { + // Parse the given arg into a URL. In the event of a parse failure, return + // our defaults. + parsed, err := url.Parse(arg) + if err != nil { + return arg, "" + } + values := parsed.Query() + + // ref is the desired git ref to target. Can be specified by in a git URL + // with ?ref= or ?version=, although ref takes precedence. + ref := values.Get("version") + if queryValue := values.Get("ref"); queryValue != "" { + ref = queryValue + } + + return parsed.Path, ref +} + +func parseHostSpec(n string) (string, string) { + var host string + // Start accumulating the host part. + for _, p := range []string{ + // Order matters here. + "git::", "gh:", "ssh://", "https://", "http://", + "git@", "github.com:", "github.com/", + } { + if len(p) < len(n) && strings.ToLower(n[:len(p)]) == p { + n = n[len(p):] + host += p + } + } + if host == "git@" { + i := strings.Index(n, "/") + if i > -1 { + host += n[:i+1] + n = n[i+1:] + } else { + i = strings.Index(n, ":") + if i > -1 { + host += n[:i+1] + n = n[i+1:] + } + } + return host, n + } + + // If host is a http(s) or ssh URL, grab the domain part. + for _, p := range []string{ + "ssh://", "https://", "http://", + } { + if strings.HasSuffix(host, p) { + i := strings.Index(n, "/") + if i > -1 { + host += n[0 : i+1] + n = n[i+1:] + } + break + } + } + + return normalizeGitHostSpec(host), n +} + +func normalizeGitHostSpec(host string) string { + s := strings.ToLower(host) + if strings.Contains(s, "github.com") { + if strings.Contains(s, "git@") || strings.Contains(s, "ssh:") { + host = "git@github.com:" + } else { + host = "https://github.com/" + } + } + if strings.HasPrefix(s, "git::") { + host = strings.TrimPrefix(s, "git::") + } + return host +} + +// The format of Azure repo URL is documented +// https://docs.microsoft.com/en-us/azure/devops/repos/git/clone?view=vsts&tabs=visual-studio#clone_url +func isAzureHost(host string) bool { + return strings.Contains(host, "dev.azure.com") || + strings.Contains(host, "visualstudio.com") +} + +// The format of AWS repo URL is documented +// https://docs.aws.amazon.com/codecommit/latest/userguide/regions.html +func isAWSHost(host string) bool { + return strings.Contains(host, "amazonaws.com") +} diff --git a/util/kustomize/repospec_test.go b/util/kustomize/repospec_test.go new file mode 100644 index 0000000000000..1a18064071033 --- /dev/null +++ b/util/kustomize/repospec_test.go @@ -0,0 +1,250 @@ +// The following file was copied from https://github.com/kubernetes-sigs/kustomize/blob/master/api/internal/git/repospec.go +// and modified to expose the ParseGitUrl function +// +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package kustomize + +import ( + "fmt" + "path/filepath" + "testing" + + "github.com/stretchr/testify/assert" +) + +const ( + refQuery = "?ref=" +) + +var orgRepos = []string{"someOrg/someRepo", "kubernetes/website"} + +var pathNames = []string{"README.md", "foo/krusty.txt", ""} + +var hrefArgs = []string{"someBranch", "master", "v0.1.0", ""} + +var hostNamesRawAndNormalized = [][]string{ + {"gh:", "gh:"}, + {"GH:", "gh:"}, + {"gitHub.com/", "https://github.com/"}, + {"github.com:", "https://github.com/"}, + {"http://github.com/", "https://github.com/"}, + {"https://github.com/", "https://github.com/"}, + {"hTTps://github.com/", "https://github.com/"}, + {"https://git-codecommit.us-east-2.amazonaws.com/", "https://git-codecommit.us-east-2.amazonaws.com/"}, + {"https://fabrikops2.visualstudio.com/", "https://fabrikops2.visualstudio.com/"}, + {"ssh://git.example.com:7999/", "ssh://git.example.com:7999/"}, + {"git::https://gitlab.com/", "https://gitlab.com/"}, + {"git::http://git.example.com/", "http://git.example.com/"}, + {"git::https://git.example.com/", "https://git.example.com/"}, + {"git@github.com:", "git@github.com:"}, + {"git@github.com/", "git@github.com:"}, +} + +func makeURL(hostFmt, orgRepo, path, href string) string { + if len(path) > 0 { + orgRepo = filepath.Join(orgRepo, path) + } + url := hostFmt + orgRepo + if href != "" { + url += refQuery + href + } + return url +} + +func TestNewRepoSpecFromUrl(t *testing.T) { + var bad [][]string + for _, tuple := range hostNamesRawAndNormalized { + hostRaw := tuple[0] + hostSpec := tuple[1] + for _, orgRepo := range orgRepos { + for _, pathName := range pathNames { + for _, hrefArg := range hrefArgs { + uri := makeURL(hostRaw, orgRepo, pathName, hrefArg) + host, org, path, ref := parseGitURL(uri) + if host != hostSpec { + bad = append(bad, []string{"host", uri, host, hostSpec}) + } + if org != orgRepo { + bad = append(bad, []string{"orgRepo", uri, org, orgRepo}) + } + if path != pathName { + bad = append(bad, []string{"path", uri, path, pathName}) + } + if ref != hrefArg { + bad = append(bad, []string{"ref", uri, ref, hrefArg}) + } + } + } + } + } + if len(bad) > 0 { + for _, tuple := range bad { + fmt.Printf("\n"+ + " from uri: %s\n"+ + " actual %4s: %s\n"+ + "expected %4s: %s\n", + tuple[1], tuple[0], tuple[2], tuple[0], tuple[3]) + } + t.Fail() + } +} + +func TestIsAzureHost(t *testing.T) { + testcases := []struct { + input string + expect bool + }{ + { + input: "https://git-codecommit.us-east-2.amazonaws.com", + expect: false, + }, + { + input: "ssh://git-codecommit.us-east-2.amazonaws.com", + expect: false, + }, + { + input: "https://fabrikops2.visualstudio.com/", + expect: true, + }, + { + input: "https://dev.azure.com/myorg/myproject/", + expect: true, + }, + } + for _, testcase := range testcases { + actual := isAzureHost(testcase.input) + if actual != testcase.expect { + t.Errorf("IsAzureHost: expected %v, but got %v on %s", testcase.expect, actual, testcase.input) + } + } +} + +func TestPeelQuery(t *testing.T) { + testcases := map[string]struct { + input string + path string + ref string + }{ + "t1": { + // All empty. + input: "somerepos", + path: "somerepos", + ref: "", + }, + "t2": { + input: "somerepos?ref=v1.0.0", + path: "somerepos", + ref: "v1.0.0", + }, + "t3": { + input: "somerepos?version=master", + path: "somerepos", + ref: "master", + }, + "t4": { + // A ref value takes precedence over a version value. + input: "somerepos?version=master&ref=v1.0.0", + path: "somerepos", + ref: "v1.0.0", + }, + "t5": { + // Empty submodules value uses default. + input: "somerepos?version=master&submodules=", + path: "somerepos", + ref: "master", + }, + "t6": { + // Malformed submodules value uses default. + input: "somerepos?version=master&submodules=maybe", + path: "somerepos", + ref: "master", + }, + "t7": { + input: "somerepos?version=master&submodules=true", + path: "somerepos", + ref: "master", + }, + "t8": { + input: "somerepos?version=master&submodules=false", + path: "somerepos", + ref: "master", + }, + "t9": { + // Empty timeout value uses default. + input: "somerepos?version=master&timeout=", + path: "somerepos", + ref: "master", + }, + "t10": { + // Malformed timeout value uses default. + input: "somerepos?version=master&timeout=jiffy", + path: "somerepos", + ref: "master", + }, + "t11": { + // Zero timeout value uses default. + input: "somerepos?version=master&timeout=0", + path: "somerepos", + ref: "master", + }, + "t12": { + input: "somerepos?version=master&timeout=0s", + path: "somerepos", + ref: "master", + }, + "t13": { + input: "somerepos?version=master&timeout=61", + path: "somerepos", + ref: "master", + }, + "t14": { + input: "somerepos?version=master&timeout=1m1s", + path: "somerepos", + ref: "master", + }, + "t15": { + input: "somerepos?version=master&submodules=false&timeout=1m1s", + path: "somerepos", + ref: "master", + }, + } + for tn, tc := range testcases { + t.Run(tn, func(t *testing.T) { + path, ref := peelQuery(tc.input) + assert.Equal(t, tc.path, path, "path mismatch") + assert.Equal(t, tc.ref, ref, "ref mismatch") + }) + } +} + +func TestIsAWSHost(t *testing.T) { + testcases := []struct { + input string + expect bool + }{ + { + input: "https://git-codecommit.us-east-2.amazonaws.com", + expect: true, + }, + { + input: "ssh://git-codecommit.us-east-2.amazonaws.com", + expect: true, + }, + { + input: "git@github.com:", + expect: false, + }, + { + input: "http://github.com/", + expect: false, + }, + } + for _, testcase := range testcases { + actual := isAWSHost(testcase.input) + if actual != testcase.expect { + t.Errorf("IsAWSHost: expected %v, but got %v on %s", testcase.expect, actual, testcase.input) + } + } +} diff --git a/util/notification/argocd/service.go b/util/notification/argocd/service.go index 81082052602e1..56d6c9ed7555d 100644 --- a/util/notification/argocd/service.go +++ b/util/notification/argocd/service.go @@ -71,7 +71,7 @@ func (svc *argoCDService) getKustomizeOptions(source *v1alpha1.ApplicationSource if err != nil { return nil, err } - return kustomizeSettings.GetOptions(*source) + return kustomizeSettings.GetOptions(*source, svc.settingsMgr.GetKustomizeSetNamespaceEnabled()) } func (svc *argoCDService) GetAppDetails(ctx context.Context, app *v1alpha1.Application) (*shared.AppDetail, error) { diff --git a/util/settings/cf_settings.go b/util/settings/cf_settings.go new file mode 100644 index 0000000000000..b38f767aca4ea --- /dev/null +++ b/util/settings/cf_settings.go @@ -0,0 +1,13 @@ +package settings + +func (mgr *SettingsManager) GetKustomizeSetNamespaceEnabled() bool { + argoCDCM, err := mgr.getConfigMap() + if err != nil { + return false + } + kustomizeSetNamespaceEnabled := argoCDCM.Data[kustomizeSetNamespaceEnabledKey] + if kustomizeSetNamespaceEnabled == "" { + return false + } + return kustomizeSetNamespaceEnabled == "true" +} diff --git a/util/settings/settings.go b/util/settings/settings.go index 14c509334dc42..4b896f9e808be 100644 --- a/util/settings/settings.go +++ b/util/settings/settings.go @@ -129,6 +129,8 @@ type ArgoCDSettings struct { // ImpersonationEnabled indicates whether Application sync privileges can be decoupled from control plane // privileges using impersonation ImpersonationEnabled bool `json:"impersonationEnabled"` + // KustomizeSetNamespaceEnabled enable set namespace for kustomize by default + KustomizeSetNamespaceEnabled bool `json:"kustomizeSetNamespaceEnabled"` } type GoogleAnalytics struct { @@ -290,7 +292,7 @@ var ( } ) -func (ks *KustomizeSettings) GetOptions(source v1alpha1.ApplicationSource) (*v1alpha1.KustomizeOptions, error) { +func (ks *KustomizeSettings) GetOptions(source v1alpha1.ApplicationSource, setNamespace bool) (*v1alpha1.KustomizeOptions, error) { binaryPath := "" buildOptions := "" if source.Kustomize != nil && source.Kustomize.Version != "" { @@ -312,6 +314,7 @@ func (ks *KustomizeSettings) GetOptions(source v1alpha1.ApplicationSource) (*v1a return &v1alpha1.KustomizeOptions{ BuildOptions: buildOptions, BinaryPath: binaryPath, + SetNamespace: setNamespace, }, nil } @@ -541,6 +544,8 @@ const ( RespectRBACValueNormal = "normal" // impersonationEnabledKey is the key to configure whether the application sync decoupling through impersonation feature is enabled impersonationEnabledKey = "application.sync.impersonation.enabled" + // kustomizeSetNamespaceEnabledKey is the key to configure if kustomize set namespace should be executed + kustomizeSetNamespaceEnabledKey = "kustomize.setNamespace.enabled" ) const ( diff --git a/util/settings/settings_test.go b/util/settings/settings_test.go index 9b6e3fe2324cd..11107a9871d28 100644 --- a/util/settings/settings_test.go +++ b/util/settings/settings_test.go @@ -818,12 +818,12 @@ func TestKustomizeSettings_GetOptions(t *testing.T) { t.Run("VersionDoesNotExist", func(t *testing.T) { _, err := settings.GetOptions(v1alpha1.ApplicationSource{ Kustomize: &v1alpha1.ApplicationSourceKustomize{Version: "v4"}, - }) + }, true) require.Error(t, err) }) t.Run("DefaultBuildOptions", func(t *testing.T) { - ver, err := settings.GetOptions(v1alpha1.ApplicationSource{}) + ver, err := settings.GetOptions(v1alpha1.ApplicationSource{}, true) require.NoError(t, err) assert.Empty(t, ver.BinaryPath) assert.Equal(t, "--opt1 val1", ver.BuildOptions) @@ -832,7 +832,7 @@ func TestKustomizeSettings_GetOptions(t *testing.T) { t.Run("VersionExists", func(t *testing.T) { ver, err := settings.GetOptions(v1alpha1.ApplicationSource{ Kustomize: &v1alpha1.ApplicationSourceKustomize{Version: "v2"}, - }) + }, true) require.NoError(t, err) assert.Equal(t, "path_v2", ver.BinaryPath) assert.Empty(t, ver.BuildOptions) @@ -841,7 +841,7 @@ func TestKustomizeSettings_GetOptions(t *testing.T) { t.Run("VersionExistsWithBuildOption", func(t *testing.T) { ver, err := settings.GetOptions(v1alpha1.ApplicationSource{ Kustomize: &v1alpha1.ApplicationSourceKustomize{Version: "v3"}, - }) + }, true) require.NoError(t, err) assert.Equal(t, "path_v3", ver.BinaryPath) assert.Equal(t, "--opt2 val2", ver.BuildOptions) From 7e467ddcc7930c5ab938f69c5d05cffdca1c1435 Mon Sep 17 00:00:00 2001 From: Oleksandr Saulyak Date: Thu, 19 Jun 2025 18:29:34 +0300 Subject: [PATCH 02/13] fix(validateDestination query): as we moved to argo.GetDestinationCluster, we can simply rely on error returned from this request (#405) Signed-off-by: oleksandr-codefresh --- .../application_validate_src_and_dest.go | 21 +------------------ 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/server/application/application_validate_src_and_dest.go b/server/application/application_validate_src_and_dest.go index 87fb2ddb137e4..6b339ab4bbf35 100644 --- a/server/application/application_validate_src_and_dest.go +++ b/server/application/application_validate_src_and_dest.go @@ -5,8 +5,6 @@ import ( "errors" "fmt" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" apierrors "k8s.io/apimachinery/pkg/api/errors" "github.com/argoproj/argo-cd/v3/pkg/apiclient/application" @@ -73,22 +71,5 @@ func validateDestination(ctx context.Context, dest *appv1.ApplicationDestination return errors.New("no destination defined in app spec") } _, err := argo.GetDestinationCluster(ctx, *dest, db) - if err != nil { - return err - } - - if dest.Server != "" { - // Ensure the k8s cluster the app is referencing, is configured in Argo CD - _, err := db.GetCluster(ctx, dest.Server) - if err != nil { - if errStatus, ok := status.FromError(err); ok && errStatus.Code() == codes.NotFound { - return fmt.Errorf("cluster '%s' has not been configured", dest.Server) - } - return err - } - } else if dest.Server == "" { - return errors.New("destination server missing from app spec") - } - - return nil + return err } From 56418b05ce446f53e96efa9d862cb32eab3124f4 Mon Sep 17 00:00:00 2001 From: Regina Voloshin Date: Sun, 22 Jun 2025 17:29:03 +0300 Subject: [PATCH 03/13] removed curl from image (#406) Signed-off-by: reggie-k --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index b764b44bce732..3de0549890fbf 100644 --- a/Dockerfile +++ b/Dockerfile @@ -47,6 +47,7 @@ RUN apt-get update && \ apt-get install curl -y && \ curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash && \ apt-get install git-lfs -y && \ + apt-get remove --purge -y curl && \ groupadd -g $ARGOCD_USER_ID argocd && \ useradd -r -u $ARGOCD_USER_ID -g argocd argocd && \ mkdir -p /home/argocd && \ From be767e9dc7096720568809747d85d435c703c164 Mon Sep 17 00:00:00 2001 From: Regina Voloshin Date: Mon, 23 Jun 2025 11:24:04 +0300 Subject: [PATCH 04/13] feat: Add GitHub API metrics (#404) * added github api metrics Signed-off-by: reggie-k * fix(docs): fix applicationsetcontroller.enable.github.api.metrics to false in docs cm (#23516) Signed-off-by: reggie-k * fix: Account for batch event processing in e2e tests (#22356) Signed-off-by: Andrii Korotkov --------- Signed-off-by: reggie-k Signed-off-by: Andrii Korotkov Co-authored-by: Andrii Korotkov <137232734+andrii-korotkov-verkada@users.noreply.github.com> --- test/e2e/fixture/app/actions.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/e2e/fixture/app/actions.go b/test/e2e/fixture/app/actions.go index 28ff2420c4097..06b4a25f3ea32 100644 --- a/test/e2e/fixture/app/actions.go +++ b/test/e2e/fixture/app/actions.go @@ -6,6 +6,7 @@ import ( "os" "slices" "strconv" + "time" rbacv1 "k8s.io/api/rbac/v1" @@ -510,6 +511,7 @@ func (a *Actions) And(block func()) *Actions { func (a *Actions) Then() *Consequences { a.context.t.Helper() + time.Sleep(fixture.WhenThenSleepInterval) return &Consequences{a.context, a, 15} } From 20f7b808cc192af7c60efdbfa0ce54e875113db1 Mon Sep 17 00:00:00 2001 From: Regina Voloshin Date: Tue, 24 Jun 2025 11:35:23 +0300 Subject: [PATCH 05/13] cherry-pick 1b48f36 Upgrade ubuntu base image to latest 25.04 digest (#407) Signed-off-by: reggie-k Co-authored-by: dudinea --- Dockerfile | 12 ++++-------- test/container/Dockerfile | 9 ++++++++- test/remote/Dockerfile | 2 +- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/Dockerfile b/Dockerfile index 3de0549890fbf..91a4e410444d3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -ARG BASE_IMAGE=docker.io/library/ubuntu:24.04@sha256:80dd3c3b9c6cecb9f1667e9290b3bc61b78c2678c02cbdae5f0fea92cc6734ab +ARG BASE_IMAGE=docker.io/library/ubuntu:25.04@sha256:10bb10bb062de665d4dc3e0ea36715270ead632cfcb74d08ca2273712a0dfb42 #################################################################################################### # Builder image # Initial stage which pulls prepares build dependencies and CLI tooling we need for our final image @@ -43,19 +43,15 @@ USER root ENV ARGOCD_USER_ID=999 \ DEBIAN_FRONTEND=noninteractive -RUN apt-get update && \ - apt-get install curl -y && \ - curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash && \ - apt-get install git-lfs -y && \ - apt-get remove --purge -y curl && \ - groupadd -g $ARGOCD_USER_ID argocd && \ +RUN groupadd -g $ARGOCD_USER_ID argocd && \ useradd -r -u $ARGOCD_USER_ID -g argocd argocd && \ mkdir -p /home/argocd && \ chown argocd:0 /home/argocd && \ chmod g=u /home/argocd && \ + apt-get update && \ apt-get dist-upgrade -y && \ apt-get install -y \ - git tini gpg tzdata connect-proxy && \ + git git-lfs tini gpg tzdata connect-proxy && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* diff --git a/test/container/Dockerfile b/test/container/Dockerfile index a14f61d19f4f9..47d2f79dccfe7 100644 --- a/test/container/Dockerfile +++ b/test/container/Dockerfile @@ -14,9 +14,13 @@ FROM docker.io/library/registry:3.0@sha256:1fc7de654f2ac1247f0b67e8a459e273b0993 FROM docker.io/bitnamilegacy/kubectl:1.32@sha256:493d1b871556d48d6b25d471f192c2427571cd6f78523eebcaf4d263353c7487 AS kubectl -FROM docker.io/library/ubuntu:24.04@sha256:1e622c5f073b4f6bfad6632f2616c7f59ef256e96fe78bf6a595d1dc4376ac02 +FROM docker.io/library/ubuntu:25.04@sha256:10bb10bb062de665d4dc3e0ea36715270ead632cfcb74d08ca2273712a0dfb42 ENV DEBIAN_FRONTEND=noninteractive + +# NOTE: binutils-gold contains the gold linker, which was recently removed +# from binutils, but is still nesessary for building lint-tools on arm64 only +# until this Golang issue is fixed: https://github.com/golang/go/issues/22040 RUN apt-get update && apt-get install --fix-missing -y \ ca-certificates \ curl \ @@ -34,6 +38,9 @@ RUN apt-get update && apt-get install --fix-missing -y \ sudo \ tini \ zip && \ + if [ "$(uname -m)" = "aarch64" ]; then \ + apt-get install --fix-missing -y binutils-gold; \ + fi && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* diff --git a/test/remote/Dockerfile b/test/remote/Dockerfile index 2068272df51dd..24eaaee8d1ca4 100644 --- a/test/remote/Dockerfile +++ b/test/remote/Dockerfile @@ -1,4 +1,4 @@ -ARG BASE_IMAGE=docker.io/library/ubuntu:24.04@sha256:80dd3c3b9c6cecb9f1667e9290b3bc61b78c2678c02cbdae5f0fea92cc6734ab +ARG BASE_IMAGE=docker.io/library/ubuntu:25.04@sha256:10bb10bb062de665d4dc3e0ea36715270ead632cfcb74d08ca2273712a0dfb42 FROM docker.io/library/golang:1.24.6@sha256:2c89c41fb9efc3807029b59af69645867cfe978d2b877d475be0d72f6c6ce6f6 AS go From 32f460babe30c8b8a677afc45d0eda98b3fd39db Mon Sep 17 00:00:00 2001 From: Regina Voloshin Date: Sun, 6 Jul 2025 10:04:59 +0300 Subject: [PATCH 06/13] feat: CR-29912 manual cherry pick app set pr generator return 0 results if the repo does not exist (#409) * manually added the changes Signed-off-by: reggie-k * pull request functionality Signed-off-by: reggie-k * pull request functionality Signed-off-by: reggie-k --------- Signed-off-by: reggie-k --- applicationset/generators/pull_request.go | 12 ++- .../generators/pull_request_test.go | 38 +++++-- .../services/pull_request/azure_devops.go | 19 +++- .../pull_request/azure_devops_test.go | 34 ++++++ .../services/pull_request/bitbucket_cloud.go | 11 +- .../pull_request/bitbucket_cloud_test.go | 26 +++++ .../services/pull_request/bitbucket_server.go | 5 + .../pull_request/bitbucket_server_test.go | 26 +++++ .../services/pull_request/errors.go | 23 ++++ .../services/pull_request/errors_test.go | 48 +++++++++ applicationset/services/pull_request/gitea.go | 9 +- .../services/pull_request/gitea_test.go | 32 ++++++ .../services/pull_request/github.go | 5 + .../services/pull_request/gitlab.go | 5 + .../services/pull_request/gitlab_test.go | 26 +++++ assets/swagger.json | 4 + docs/operator-manual/applicationset.yaml | 100 +++++++++++++++++- manifests/core-install-with-hydrator.yaml | 6 ++ manifests/core-install.yaml | 6 ++ manifests/crds/applicationset-crd.yaml | 6 ++ manifests/ha/install-with-hydrator.yaml | 6 ++ manifests/ha/install.yaml | 6 ++ manifests/install-with-hydrator.yaml | 6 ++ manifests/install.yaml | 6 ++ .../v1alpha1/applicationset_types.go | 2 + pkg/apis/application/v1alpha1/generated.proto | 3 + 26 files changed, 455 insertions(+), 15 deletions(-) create mode 100644 applicationset/services/pull_request/errors.go create mode 100644 applicationset/services/pull_request/errors_test.go diff --git a/applicationset/generators/pull_request.go b/applicationset/generators/pull_request.go index 88ff44853e9cc..bf90ed661ba42 100644 --- a/applicationset/generators/pull_request.go +++ b/applicationset/generators/pull_request.go @@ -11,6 +11,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "github.com/gosimple/slug" + log "github.com/sirupsen/logrus" "github.com/argoproj/argo-cd/v3/applicationset/services" pullrequest "github.com/argoproj/argo-cd/v3/applicationset/services/pull_request" @@ -49,6 +50,10 @@ func (g *PullRequestGenerator) GetRequeueAfter(appSetGenerator *argoprojiov1alph return DefaultPullRequestRequeueAfter } +func (g *PullRequestGenerator) GetContinueOnRepoNotFoundError(appSetGenerator *argoprojiov1alpha1.ApplicationSetGenerator) bool { + return appSetGenerator.PullRequest.ContinueOnRepoNotFoundError +} + func (g *PullRequestGenerator) GetTemplate(appSetGenerator *argoprojiov1alpha1.ApplicationSetGenerator) *argoprojiov1alpha1.ApplicationSetTemplate { return &appSetGenerator.PullRequest.Template } @@ -69,10 +74,15 @@ func (g *PullRequestGenerator) GenerateParams(appSetGenerator *argoprojiov1alpha } pulls, err := pullrequest.ListPullRequests(ctx, svc, appSetGenerator.PullRequest.Filters) + params := make([]map[string]any, 0, len(pulls)) if err != nil { + if pullrequest.IsRepositoryNotFoundError(err) && g.GetContinueOnRepoNotFoundError(appSetGenerator) { + log.WithError(err).WithField("generator", g). + Warn("Skipping params generation for this repository since it was not found.") + return params, nil + } return nil, fmt.Errorf("error listing repos: %w", err) } - params := make([]map[string]any, 0, len(pulls)) // In order to follow the DNS label standard as defined in RFC 1123, // we need to limit the 'branch' to 50 to give room to append/suffix-ing it diff --git a/applicationset/generators/pull_request_test.go b/applicationset/generators/pull_request_test.go index c383cab83f13b..27180cd687bbf 100644 --- a/applicationset/generators/pull_request_test.go +++ b/applicationset/generators/pull_request_test.go @@ -16,11 +16,12 @@ import ( func TestPullRequestGithubGenerateParams(t *testing.T) { ctx := t.Context() cases := []struct { - selectFunc func(context.Context, *argoprojiov1alpha1.PullRequestGenerator, *argoprojiov1alpha1.ApplicationSet) (pullrequest.PullRequestService, error) - values map[string]string - expected []map[string]any - expectedErr error - applicationSet argoprojiov1alpha1.ApplicationSet + selectFunc func(context.Context, *argoprojiov1alpha1.PullRequestGenerator, *argoprojiov1alpha1.ApplicationSet) (pullrequest.PullRequestService, error) + values map[string]string + expected []map[string]any + expectedErr error + applicationSet argoprojiov1alpha1.ApplicationSet + continueOnRepoNotFoundError bool }{ { selectFunc: func(context.Context, *argoprojiov1alpha1.PullRequestGenerator, *argoprojiov1alpha1.ApplicationSet) (pullrequest.PullRequestService, error) { @@ -171,6 +172,30 @@ func TestPullRequestGithubGenerateParams(t *testing.T) { expected: nil, expectedErr: errors.New("error listing repos: fake error"), }, + { + selectFunc: func(context.Context, *argoprojiov1alpha1.PullRequestGenerator, *argoprojiov1alpha1.ApplicationSet) (pullrequest.PullRequestService, error) { + return pullrequest.NewFakeService( + ctx, + nil, + pullrequest.NewRepositoryNotFoundError(errors.New("repository not found")), + ) + }, + expected: []map[string]any{}, + expectedErr: nil, + continueOnRepoNotFoundError: true, + }, + { + selectFunc: func(context.Context, *argoprojiov1alpha1.PullRequestGenerator, *argoprojiov1alpha1.ApplicationSet) (pullrequest.PullRequestService, error) { + return pullrequest.NewFakeService( + ctx, + nil, + pullrequest.NewRepositoryNotFoundError(errors.New("repository not found")), + ) + }, + expected: nil, + expectedErr: errors.New("error listing repos: repository not found"), + continueOnRepoNotFoundError: false, + }, { selectFunc: func(context.Context, *argoprojiov1alpha1.PullRequestGenerator, *argoprojiov1alpha1.ApplicationSet) (pullrequest.PullRequestService, error) { return pullrequest.NewFakeService( @@ -260,7 +285,8 @@ func TestPullRequestGithubGenerateParams(t *testing.T) { } generatorConfig := argoprojiov1alpha1.ApplicationSetGenerator{ PullRequest: &argoprojiov1alpha1.PullRequestGenerator{ - Values: c.values, + Values: c.values, + ContinueOnRepoNotFoundError: c.continueOnRepoNotFoundError, }, } diff --git a/applicationset/services/pull_request/azure_devops.go b/applicationset/services/pull_request/azure_devops.go index f70d2eda13865..c9dc23a28aba2 100644 --- a/applicationset/services/pull_request/azure_devops.go +++ b/applicationset/services/pull_request/azure_devops.go @@ -10,7 +10,10 @@ import ( "github.com/microsoft/azure-devops-go-api/azuredevops/v7/git" ) -const AZURE_DEVOPS_DEFAULT_URL = "https://dev.azure.com" +const ( + AZURE_DEVOPS_DEFAULT_URL = "https://dev.azure.com" + AZURE_DEVOPS_PROJECT_NOT_FOUND_ERROR = "The following project does not exist" +) type AzureDevOpsClientFactory interface { // Returns an Azure Devops Client interface. @@ -70,13 +73,21 @@ func (a *AzureDevOpsService) List(ctx context.Context) ([]*PullRequest, error) { SearchCriteria: &git.GitPullRequestSearchCriteria{}, } + pullRequests := []*PullRequest{} + azurePullRequests, err := client.GetPullRequestsByProject(ctx, args) if err != nil { - return nil, fmt.Errorf("failed to get pull requests by project: %w", err) + // A standard Http 404 error is not returned for Azure DevOps, + // so checking the error message for a specific pattern. + // NOTE: Since the repos are filtered later, only existence of the project + // is relevant for AzureDevOps + if strings.Contains(err.Error(), AZURE_DEVOPS_PROJECT_NOT_FOUND_ERROR) { + // return a custom error indicating that the repository is not found, + // but also return the empty result since the decision to continue or not in this case is made by the caller + return pullRequests, NewRepositoryNotFoundError(err) + } } - pullRequests := []*PullRequest{} - for _, pr := range *azurePullRequests { if pr.Repository == nil || pr.Repository.Name == nil || diff --git a/applicationset/services/pull_request/azure_devops_test.go b/applicationset/services/pull_request/azure_devops_test.go index 29774ad08e76a..1cf2bfd299903 100644 --- a/applicationset/services/pull_request/azure_devops_test.go +++ b/applicationset/services/pull_request/azure_devops_test.go @@ -2,6 +2,7 @@ package pull_request import ( "context" + "errors" "testing" "github.com/microsoft/azure-devops-go-api/azuredevops/v7/core" @@ -235,3 +236,36 @@ func TestBuildURL(t *testing.T) { }) } } + +func TestAzureDevOpsListReturnsRepositoryNotFoundError(t *testing.T) { + args := git.GetPullRequestsByProjectArgs{ + Project: createStringPtr("nonexistent"), + SearchCriteria: &git.GitPullRequestSearchCriteria{}, + } + + pullRequestMock := []git.GitPullRequest{} + + gitClientMock := azureMock.Client{} + clientFactoryMock := &AzureClientFactoryMock{mock: &mock.Mock{}} + clientFactoryMock.mock.On("GetClient", mock.Anything).Return(&gitClientMock, nil) + + // Mock the GetPullRequestsByProject to return an error containing "404" + gitClientMock.On("GetPullRequestsByProject", t.Context(), args).Return(&pullRequestMock, + errors.New("The following project does not exist:")) + + provider := AzureDevOpsService{ + clientFactory: clientFactoryMock, + project: "nonexistent", + repo: "nonexistent", + labels: nil, + } + + prs, err := provider.List(t.Context()) + + // Should return empty pull requests list + assert.Empty(t, prs) + + // Should return RepositoryNotFoundError + require.Error(t, err) + assert.True(t, IsRepositoryNotFoundError(err), "Expected RepositoryNotFoundError but got: %v", err) +} diff --git a/applicationset/services/pull_request/bitbucket_cloud.go b/applicationset/services/pull_request/bitbucket_cloud.go index 1d03bb0249c6d..1e4b8dc30e8e7 100644 --- a/applicationset/services/pull_request/bitbucket_cloud.go +++ b/applicationset/services/pull_request/bitbucket_cloud.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" "net/url" + "strings" "github.com/ktrysmt/go-bitbucket" ) @@ -117,8 +118,17 @@ func (b *BitbucketCloudService) List(_ context.Context) ([]*PullRequest, error) RepoSlug: b.repositorySlug, } + pullRequests := []*PullRequest{} + response, err := b.client.Repositories.PullRequests.Gets(opts) if err != nil { + // A standard Http 404 error is not returned for Bitbucket Cloud, + // so checking the error message for a specific pattern + if strings.Contains(err.Error(), "404 Not Found") { + // return a custom error indicating that the repository is not found, + // but also return the empty result since the decision to continue or not in this case is made by the caller + return pullRequests, NewRepositoryNotFoundError(err) + } return nil, fmt.Errorf("error listing pull requests for %s/%s: %w", b.owner, b.repositorySlug, err) } @@ -142,7 +152,6 @@ func (b *BitbucketCloudService) List(_ context.Context) ([]*PullRequest, error) return nil, fmt.Errorf("error unmarshalling json to type '[]BitbucketCloudPullRequest': %w", err) } - pullRequests := []*PullRequest{} for _, pull := range pulls { pullRequests = append(pullRequests, &PullRequest{ Number: pull.ID, diff --git a/applicationset/services/pull_request/bitbucket_cloud_test.go b/applicationset/services/pull_request/bitbucket_cloud_test.go index f406ae4e00e56..0e771048bcd8b 100644 --- a/applicationset/services/pull_request/bitbucket_cloud_test.go +++ b/applicationset/services/pull_request/bitbucket_cloud_test.go @@ -492,3 +492,29 @@ func TestListPullRequestBranchMatchCloud(t *testing.T) { TargetBranch: "branch-200", }, *pullRequests[0]) } + +func TestBitbucketCloudListReturnsRepositoryNotFoundError(t *testing.T) { + mux := http.NewServeMux() + server := httptest.NewServer(mux) + defer server.Close() + + path := "/repositories/nonexistent/nonexistent/pullrequests/" + + mux.HandleFunc(path, func(w http.ResponseWriter, _ *http.Request) { + // Return 404 status to simulate repository not found + w.WriteHeader(http.StatusNotFound) + _, _ = w.Write([]byte(`{"message": "404 Project Not Found"}`)) + }) + + svc, err := NewBitbucketCloudServiceNoAuth(server.URL, "nonexistent", "nonexistent") + require.NoError(t, err) + + prs, err := svc.List(t.Context()) + + // Should return empty pull requests list + assert.Empty(t, prs) + + // Should return RepositoryNotFoundError + require.Error(t, err) + assert.True(t, IsRepositoryNotFoundError(err), "Expected RepositoryNotFoundError but got: %v", err) +} diff --git a/applicationset/services/pull_request/bitbucket_server.go b/applicationset/services/pull_request/bitbucket_server.go index 26680a10ef7e9..7b004050baf4a 100644 --- a/applicationset/services/pull_request/bitbucket_server.go +++ b/applicationset/services/pull_request/bitbucket_server.go @@ -66,6 +66,11 @@ func (b *BitbucketService) List(_ context.Context) ([]*PullRequest, error) { for { response, err := b.client.DefaultApi.GetPullRequestsPage(b.projectKey, b.repositorySlug, paged) if err != nil { + if response != nil && response.Response != nil && response.StatusCode == http.StatusNotFound { + // return a custom error indicating that the repository is not found, + // but also return the empty result since the decision to continue or not in this case is made by the caller + return pullRequests, NewRepositoryNotFoundError(err) + } return nil, fmt.Errorf("error listing pull requests for %s/%s: %w", b.projectKey, b.repositorySlug, err) } pulls, err := bitbucketv1.GetPullRequestsResponse(response) diff --git a/applicationset/services/pull_request/bitbucket_server_test.go b/applicationset/services/pull_request/bitbucket_server_test.go index 745ac9f7444db..2ce70d3fbaa61 100644 --- a/applicationset/services/pull_request/bitbucket_server_test.go +++ b/applicationset/services/pull_request/bitbucket_server_test.go @@ -510,3 +510,29 @@ func TestListPullRequestBranchMatch(t *testing.T) { }) require.Error(t, err) } + +func TestBitbucketServerListReturnsRepositoryNotFoundError(t *testing.T) { + mux := http.NewServeMux() + server := httptest.NewServer(mux) + defer server.Close() + + path := "/rest/api/1.0/projects/nonexistent/repos/nonexistent/pull-requests?limit=100" + + mux.HandleFunc(path, func(w http.ResponseWriter, _ *http.Request) { + // Return 404 status to simulate repository not found + w.WriteHeader(http.StatusNotFound) + _, _ = w.Write([]byte(`{"message": "404 Project Not Found"}`)) + }) + + svc, err := NewBitbucketServiceNoAuth(t.Context(), server.URL, "nonexistent", "nonexistent", "", false, nil) + require.NoError(t, err) + + prs, err := svc.List(t.Context()) + + // Should return empty pull requests list + assert.Empty(t, prs) + + // Should return RepositoryNotFoundError + require.Error(t, err) + assert.True(t, IsRepositoryNotFoundError(err), "Expected RepositoryNotFoundError but got: %v", err) +} diff --git a/applicationset/services/pull_request/errors.go b/applicationset/services/pull_request/errors.go new file mode 100644 index 0000000000000..69d3add0de77f --- /dev/null +++ b/applicationset/services/pull_request/errors.go @@ -0,0 +1,23 @@ +package pull_request + +import "errors" + +// RepositoryNotFoundError represents an error when a repository is not found by a pull request provider +type RepositoryNotFoundError struct { + causingError error +} + +func (e *RepositoryNotFoundError) Error() string { + return e.causingError.Error() +} + +// NewRepositoryNotFoundError creates a new repository not found error +func NewRepositoryNotFoundError(err error) error { + return &RepositoryNotFoundError{causingError: err} +} + +// IsRepositoryNotFoundError checks if the given error is a repository not found error +func IsRepositoryNotFoundError(err error) bool { + var repoErr *RepositoryNotFoundError + return errors.As(err, &repoErr) +} diff --git a/applicationset/services/pull_request/errors_test.go b/applicationset/services/pull_request/errors_test.go new file mode 100644 index 0000000000000..7563135aac7eb --- /dev/null +++ b/applicationset/services/pull_request/errors_test.go @@ -0,0 +1,48 @@ +package pull_request + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestRepositoryNotFoundError(t *testing.T) { + t.Run("NewRepositoryNotFoundError creates correct error type", func(t *testing.T) { + originalErr := errors.New("repository does not exist") + repoNotFoundErr := NewRepositoryNotFoundError(originalErr) + + require.Error(t, repoNotFoundErr) + assert.Equal(t, "repository does not exist", repoNotFoundErr.Error()) + }) + + t.Run("IsRepositoryNotFoundError identifies RepositoryNotFoundError", func(t *testing.T) { + originalErr := errors.New("repository does not exist") + repoNotFoundErr := NewRepositoryNotFoundError(originalErr) + + assert.True(t, IsRepositoryNotFoundError(repoNotFoundErr)) + }) + + t.Run("IsRepositoryNotFoundError returns false for regular errors", func(t *testing.T) { + regularErr := errors.New("some other error") + + assert.False(t, IsRepositoryNotFoundError(regularErr)) + }) + + t.Run("IsRepositoryNotFoundError returns false for nil error", func(t *testing.T) { + assert.False(t, IsRepositoryNotFoundError(nil)) + }) + + t.Run("IsRepositoryNotFoundError works with wrapped errors", func(t *testing.T) { + originalErr := errors.New("repository does not exist") + repoNotFoundErr := NewRepositoryNotFoundError(originalErr) + wrappedErr := errors.New("wrapped: " + repoNotFoundErr.Error()) + + // Direct RepositoryNotFoundError should be identified + assert.True(t, IsRepositoryNotFoundError(repoNotFoundErr)) + + // Wrapped string error should not be identified (this is expected behavior) + assert.False(t, IsRepositoryNotFoundError(wrappedErr)) + }) +} diff --git a/applicationset/services/pull_request/gitea.go b/applicationset/services/pull_request/gitea.go index d0e51c23aa3d0..8c49a1039970e 100644 --- a/applicationset/services/pull_request/gitea.go +++ b/applicationset/services/pull_request/gitea.go @@ -52,11 +52,16 @@ func (g *GiteaService) List(ctx context.Context) ([]*PullRequest, error) { State: gitea.StateOpen, } g.client.SetContext(ctx) - prs, _, err := g.client.ListRepoPullRequests(g.owner, g.repo, opts) + list := []*PullRequest{} + prs, resp, err := g.client.ListRepoPullRequests(g.owner, g.repo, opts) if err != nil { + if resp != nil && resp.StatusCode == http.StatusNotFound { + // return a custom error indicating that the repository is not found, + // but also returning the empty result since the decision to continue or not in this case is made by the caller + return list, NewRepositoryNotFoundError(err) + } return nil, err } - list := []*PullRequest{} for _, pr := range prs { if !giteaContainLabels(g.labels, pr.Labels) { continue diff --git a/applicationset/services/pull_request/gitea_test.go b/applicationset/services/pull_request/gitea_test.go index c2b1ec22b1754..fc51cb0ff1887 100644 --- a/applicationset/services/pull_request/gitea_test.go +++ b/applicationset/services/pull_request/gitea_test.go @@ -339,3 +339,35 @@ func TestGetGiteaPRLabelNames(t *testing.T) { }) } } + +func TestGiteaListReturnsRepositoryNotFoundError(t *testing.T) { + mux := http.NewServeMux() + server := httptest.NewServer(mux) + defer server.Close() + + // Handle version endpoint that Gitea client calls first + mux.HandleFunc("/api/v1/version", func(w http.ResponseWriter, _ *http.Request) { + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write([]byte(`{"version":"1.17.0+dev-452-g1f0541780"}`)) + }) + + path := "/api/v1/repos/nonexistent/nonexistent/pulls?limit=0&page=1&state=open" + + mux.HandleFunc(path, func(w http.ResponseWriter, _ *http.Request) { + // Return 404 status to simulate repository not found + w.WriteHeader(http.StatusNotFound) + _, _ = w.Write([]byte(`{"message": "404 Project Not Found"}`)) + }) + + svc, err := NewGiteaService("", server.URL, "nonexistent", "nonexistent", false) + require.NoError(t, err) + + prs, err := svc.List(t.Context()) + + // Should return empty pull requests list + assert.Empty(t, prs) + + // Should return RepositoryNotFoundError + require.Error(t, err) + assert.True(t, IsRepositoryNotFoundError(err), "Expected RepositoryNotFoundError but got: %v", err) +} diff --git a/applicationset/services/pull_request/github.go b/applicationset/services/pull_request/github.go index 79b128b3b1d1e..5cf2e40a337e6 100644 --- a/applicationset/services/pull_request/github.go +++ b/applicationset/services/pull_request/github.go @@ -64,6 +64,11 @@ func (g *GithubService) List(ctx context.Context) ([]*PullRequest, error) { for { pulls, resp, err := g.client.PullRequests.List(ctx, g.owner, g.repo, opts) if err != nil { + if resp != nil && resp.StatusCode == http.StatusNotFound { + // return a custom error indicating that the repository is not found, + // but also returning the empty result since the decision to continue or not in this case is made by the caller + return pullRequests, NewRepositoryNotFoundError(err) + } return nil, fmt.Errorf("error listing pull requests for %s/%s: %w", g.owner, g.repo, err) } for _, pull := range pulls { diff --git a/applicationset/services/pull_request/gitlab.go b/applicationset/services/pull_request/gitlab.go index d6d94cf05e2d4..139f3d3518ca7 100644 --- a/applicationset/services/pull_request/gitlab.go +++ b/applicationset/services/pull_request/gitlab.go @@ -76,6 +76,11 @@ func (g *GitLabService) List(ctx context.Context) ([]*PullRequest, error) { for { mrs, resp, err := g.client.MergeRequests.ListProjectMergeRequests(g.project, opts, gitlab.WithContext(ctx)) if err != nil { + if resp != nil && resp.StatusCode == http.StatusNotFound { + // return a custom error indicating that the repository is not found, + // but also returning the empty result since the decision to continue or not in this case is made by the caller + return pullRequests, NewRepositoryNotFoundError(err) + } return nil, fmt.Errorf("error listing merge requests for project '%s': %w", g.project, err) } for _, mr := range mrs { diff --git a/applicationset/services/pull_request/gitlab_test.go b/applicationset/services/pull_request/gitlab_test.go index ab8e99456af33..08c7d314393a0 100644 --- a/applicationset/services/pull_request/gitlab_test.go +++ b/applicationset/services/pull_request/gitlab_test.go @@ -191,3 +191,29 @@ func TestListWithStateTLS(t *testing.T) { }) } } + +func TestGitLabListReturnsRepositoryNotFoundError(t *testing.T) { + mux := http.NewServeMux() + server := httptest.NewServer(mux) + defer server.Close() + + path := "/api/v4/projects/nonexistent/merge_requests" + + mux.HandleFunc(path, func(w http.ResponseWriter, _ *http.Request) { + // Return 404 status to simulate repository not found + w.WriteHeader(http.StatusNotFound) + _, _ = w.Write([]byte(`{"message": "404 Project Not Found"}`)) + }) + + svc, err := NewGitLabService("", server.URL, "nonexistent", []string{}, "", "", false, nil) + require.NoError(t, err) + + prs, err := svc.List(t.Context()) + + // Should return empty pull requests list + assert.Empty(t, prs) + + // Should return RepositoryNotFoundError + require.Error(t, err) + assert.True(t, IsRepositoryNotFoundError(err), "Expected RepositoryNotFoundError but got: %v", err) +} diff --git a/assets/swagger.json b/assets/swagger.json index 39ce85cab94d2..a5f1c192f42a6 100644 --- a/assets/swagger.json +++ b/assets/swagger.json @@ -9028,6 +9028,10 @@ "bitbucketServer": { "$ref": "#/definitions/v1alpha1PullRequestGeneratorBitbucketServer" }, + "continueOnRepoNotFoundError": { + "description": "ContinueOnRepoNotFoundError is a flag to continue the ApplicationSet Pull Request generator parameters generation even if the repository is not found.", + "type": "boolean" + }, "filters": { "description": "Filters for which pull requests should be considered.", "type": "array", diff --git a/docs/operator-manual/applicationset.yaml b/docs/operator-manual/applicationset.yaml index 14046713bb46b..452e4b7a17489 100644 --- a/docs/operator-manual/applicationset.yaml +++ b/docs/operator-manual/applicationset.yaml @@ -325,4 +325,102 @@ spec: jqPathExpressions: - .spec.source.helm.values - \ No newline at end of file + # Cluster-decision-resource-based ApplicationSet generator + - clusterDecisionResource: + # ConfigMap with GVK information for the duck type resource + configMapRef: my-configmap + name: quak # Choose either "name" of the resource or "labelSelector" + labelSelector: + matchLabels: # OPTIONAL + duck: spotted + matchExpressions: # OPTIONAL + - key: duck + operator: In + values: + - "spotted" + - "canvasback" + # OPTIONAL: Checks for changes every 60sec (default 3min) + requeueAfterSeconds: 60 + + # The Pull Request generator uses the API of an SCMaaS provider to automatically discover open pull requests within a repository + - pullRequest: + # When using a Pull Request generator, the ApplicationSet controller polls every `requeueAfterSeconds` interval (defaulting to every 30 minutes) to detect changes. + requeueAfterSeconds: 1800 + # When set to true, the ApplicationSet controller will continue to generate Applications even if the repository is not found, and will not enter a failed state. + # One example use case is when a pull request generator is combined with a Git generator in a matrix generator. + # NOTE, that if a repository exists but is inaccessible due to + # access rights, SCM providers usually return a "404 Not Found" error + # instead of a "403 Permission Denied" error. Consequently, using this + # option may lead to the deletion of Argo CD applications if the SCM + # user associated with the token loses access to the repository. + continueOnRepoNotFoundError: false + # See below for provider specific options. + # Specify the repository from which to fetch the GitHub Pull requests. + github: + # The GitHub organization or user. + owner: myorg + # The Github repository + repo: myrepository + # For GitHub Enterprise (optional) + api: https://git.example.com/ + # Reference to a Secret containing an access token. (optional) + tokenRef: + secretName: github-token + key: token + # (optional) use a GitHub App to access the API instead of a PAT. + appSecretName: github-app-repo-creds + # Labels is used to filter the PRs that you want to target. (optional) + labels: + - preview + + # Filters allow selecting which pull requests to generate for + # Include any pull request ending with "argocd". (optional) + filters: + - branchMatch: ".*-argocd" + + # Specify the project from which to fetch the GitLab merge requests. + gitlab: + # Specify the repository from which to fetch the Gitea Pull requests. + gitea: + # Fetch pull requests from a repo hosted on a Bitbucket Server (not the same as Bitbucket Cloud). + bitbucketServer: + # Fetch pull requests from a repo hosted on a Bitbucket Cloud. + bitbucket: + # Specify the organization, project and repository from which you want to fetch pull requests. + azuredevops: + # Fetch pull requests from AWS CodeCommit repositories. + awsCodeCommit: + +# The list generator generates a set of two application which then filter by the key value to only select the env with value staging + - list: + elements: + - cluster: engineering-dev + url: https://kubernetes.default.svc + env: staging + - cluster: engineering-prod + url: https://kubernetes.default.svc + env: prod + # The generator's template field takes precedence over the spec's template fields + template: + metadata: {} + spec: + project: "default" + source: + revision: HEAD + repoURL: https://github.com/argoproj/argo-cd.git + # New path value is generated here: + path: 'applicationset/examples/template-override/{{cluster}}-override' + destination: {} + + selector: + matchLabels: + env: staging + # It is also possible to use matchExpressions for more powerful selectors + - clusters: {} + selector: + matchExpressions: + - key: server + operator: In + values: + - https://kubernetes.default.svc + - https://some-other-cluster diff --git a/manifests/core-install-with-hydrator.yaml b/manifests/core-install-with-hydrator.yaml index bddd2a61e865c..05891cc21c077 100644 --- a/manifests/core-install-with-hydrator.yaml +++ b/manifests/core-install-with-hydrator.yaml @@ -12166,6 +12166,8 @@ spec: - project - repo type: object + continueOnRepoNotFoundError: + type: boolean filters: items: properties: @@ -18006,6 +18008,8 @@ spec: - project - repo type: object + continueOnRepoNotFoundError: + type: boolean filters: items: properties: @@ -21135,6 +21139,8 @@ spec: - project - repo type: object + continueOnRepoNotFoundError: + type: boolean filters: items: properties: diff --git a/manifests/core-install.yaml b/manifests/core-install.yaml index 9ee8c09be07c2..9b87fa507d2a9 100644 --- a/manifests/core-install.yaml +++ b/manifests/core-install.yaml @@ -12166,6 +12166,8 @@ spec: - project - repo type: object + continueOnRepoNotFoundError: + type: boolean filters: items: properties: @@ -18006,6 +18008,8 @@ spec: - project - repo type: object + continueOnRepoNotFoundError: + type: boolean filters: items: properties: @@ -21135,6 +21139,8 @@ spec: - project - repo type: object + continueOnRepoNotFoundError: + type: boolean filters: items: properties: diff --git a/manifests/crds/applicationset-crd.yaml b/manifests/crds/applicationset-crd.yaml index 8cb86b7b94279..30830bdc24a1d 100644 --- a/manifests/crds/applicationset-crd.yaml +++ b/manifests/crds/applicationset-crd.yaml @@ -6262,6 +6262,8 @@ spec: - project - repo type: object + continueOnRepoNotFoundError: + type: boolean filters: items: properties: @@ -12102,6 +12104,8 @@ spec: - project - repo type: object + continueOnRepoNotFoundError: + type: boolean filters: items: properties: @@ -15231,6 +15235,8 @@ spec: - project - repo type: object + continueOnRepoNotFoundError: + type: boolean filters: items: properties: diff --git a/manifests/ha/install-with-hydrator.yaml b/manifests/ha/install-with-hydrator.yaml index 411258a59c641..7a2099b855d13 100644 --- a/manifests/ha/install-with-hydrator.yaml +++ b/manifests/ha/install-with-hydrator.yaml @@ -12166,6 +12166,8 @@ spec: - project - repo type: object + continueOnRepoNotFoundError: + type: boolean filters: items: properties: @@ -18006,6 +18008,8 @@ spec: - project - repo type: object + continueOnRepoNotFoundError: + type: boolean filters: items: properties: @@ -21135,6 +21139,8 @@ spec: - project - repo type: object + continueOnRepoNotFoundError: + type: boolean filters: items: properties: diff --git a/manifests/ha/install.yaml b/manifests/ha/install.yaml index c54ecbd35d246..3b6e925e5dff0 100644 --- a/manifests/ha/install.yaml +++ b/manifests/ha/install.yaml @@ -12166,6 +12166,8 @@ spec: - project - repo type: object + continueOnRepoNotFoundError: + type: boolean filters: items: properties: @@ -18006,6 +18008,8 @@ spec: - project - repo type: object + continueOnRepoNotFoundError: + type: boolean filters: items: properties: @@ -21135,6 +21139,8 @@ spec: - project - repo type: object + continueOnRepoNotFoundError: + type: boolean filters: items: properties: diff --git a/manifests/install-with-hydrator.yaml b/manifests/install-with-hydrator.yaml index 89e712dc87842..c0871ef41261c 100644 --- a/manifests/install-with-hydrator.yaml +++ b/manifests/install-with-hydrator.yaml @@ -12166,6 +12166,8 @@ spec: - project - repo type: object + continueOnRepoNotFoundError: + type: boolean filters: items: properties: @@ -18006,6 +18008,8 @@ spec: - project - repo type: object + continueOnRepoNotFoundError: + type: boolean filters: items: properties: @@ -21135,6 +21139,8 @@ spec: - project - repo type: object + continueOnRepoNotFoundError: + type: boolean filters: items: properties: diff --git a/manifests/install.yaml b/manifests/install.yaml index 094c405892a44..2bce038c02961 100644 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -12166,6 +12166,8 @@ spec: - project - repo type: object + continueOnRepoNotFoundError: + type: boolean filters: items: properties: @@ -18006,6 +18008,8 @@ spec: - project - repo type: object + continueOnRepoNotFoundError: + type: boolean filters: items: properties: @@ -21135,6 +21139,8 @@ spec: - project - repo type: object + continueOnRepoNotFoundError: + type: boolean filters: items: properties: diff --git a/pkg/apis/application/v1alpha1/applicationset_types.go b/pkg/apis/application/v1alpha1/applicationset_types.go index 1bd56992cc9bb..ee330e77a7795 100644 --- a/pkg/apis/application/v1alpha1/applicationset_types.go +++ b/pkg/apis/application/v1alpha1/applicationset_types.go @@ -615,6 +615,8 @@ type PullRequestGenerator struct { AzureDevOps *PullRequestGeneratorAzureDevOps `json:"azuredevops,omitempty" protobuf:"bytes,9,opt,name=azuredevops"` // Values contains key/value pairs which are passed directly as parameters to the template Values map[string]string `json:"values,omitempty" protobuf:"bytes,10,name=values"` + // ContinueOnRepoNotFoundError is a flag to continue the ApplicationSet Pull Request generator parameters generation even if the repository is not found. + ContinueOnRepoNotFoundError bool `json:"continueOnRepoNotFoundError,omitempty" protobuf:"varint,11,opt,name=continueOnRepoNotFoundError"` // If you add a new SCM provider, update CustomApiUrl below. } diff --git a/pkg/apis/application/v1alpha1/generated.proto b/pkg/apis/application/v1alpha1/generated.proto index 9306c606bea4d..3dea90626abea 100644 --- a/pkg/apis/application/v1alpha1/generated.proto +++ b/pkg/apis/application/v1alpha1/generated.proto @@ -1593,6 +1593,9 @@ message PullRequestGenerator { // Values contains key/value pairs which are passed directly as parameters to the template map values = 10; + + // ContinueOnRepoNotFoundError is a flag to continue the ApplicationSet Pull Request generator parameters generation even if the repository is not found. + optional bool continueOnRepoNotFoundError = 11; } // PullRequestGeneratorAzureDevOps defines connection info specific to AzureDevOps. From d87834970712f95038f1e88bcf129bd47304a818 Mon Sep 17 00:00:00 2001 From: Regina Voloshin Date: Tue, 5 Aug 2025 10:41:26 +0300 Subject: [PATCH 07/13] feat: move pkg/exec in-tree and add fatal timeout upgrade with SIGKILL to ARGO_EXEC_TIMEOUT (#419) * chore: move pkg/exec in-tree (#22175) (#22460) Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> * fix: add fatal timeout upgrade with SIGKILL to ARGO_EXEC_TIMEOUT (closes #20785, #18478) (#22713) Signed-off-by: Hazel Sudzilouski Signed-off-by: Alexandre Gaudreault Co-authored-by: Alexandre Gaudreault --------- Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> Signed-off-by: Hazel Sudzilouski Signed-off-by: Alexandre Gaudreault Co-authored-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> Co-authored-by: Hazel Sudzilouski Co-authored-by: Alexandre Gaudreault --- util/exec/exec_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/util/exec/exec_test.go b/util/exec/exec_test.go index d8113ce260762..89e582e1fcbcf 100644 --- a/util/exec/exec_test.go +++ b/util/exec/exec_test.go @@ -203,9 +203,9 @@ func TestRunInDir(t *testing.T) { } func TestRedact(t *testing.T) { - assert.Empty(t, Redact(nil)("")) - assert.Empty(t, Redact([]string{})("")) - assert.Empty(t, Redact([]string{"foo"})("")) + assert.Equal(t, "", Redact(nil)("")) + assert.Equal(t, "", Redact([]string{})("")) + assert.Equal(t, "", Redact([]string{"foo"})("")) assert.Equal(t, "foo", Redact([]string{})("foo")) assert.Equal(t, "******", Redact([]string{"foo"})("foo")) assert.Equal(t, "****** ******", Redact([]string{"foo", "bar"})("foo bar")) From 254a0c1dd6dd5c97fa02565c525b2d4f0dd09744 Mon Sep 17 00:00:00 2001 From: Regina Voloshin Date: Tue, 12 Aug 2025 09:51:11 +0300 Subject: [PATCH 08/13] feat: CR-30512 stop using bitnami images (#420) * removed references from all the images except for astra healthcheck Signed-off-by: reggie-k * removed reposerver/repository/testdata/helm-with-local-dependency/.argocd-helm-dep-up Signed-off-by: reggie-k * reverted health check references since they are treated as text Signed-off-by: reggie-k * reverted health check references since they are treated as text Signed-off-by: reggie-k --------- Signed-off-by: reggie-k --- util/helm/testdata/dependency/values.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/helm/testdata/dependency/values.yaml b/util/helm/testdata/dependency/values.yaml index 9f7f1e8b3cccb..8f59d97ba1e02 100644 --- a/util/helm/testdata/dependency/values.yaml +++ b/util/helm/testdata/dependency/values.yaml @@ -3,7 +3,7 @@ ## image: registry: docker.io - repository: bitnami/wordpress + repository: bitnamilegacy/wordpress tag: 4.9.8-debian-9 ## Specify a imagePullPolicy ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' From e4313f968386b31c09ba22761d05072c93de2ca9 Mon Sep 17 00:00:00 2001 From: Papapetrou Patroklos <1743100+ppapapetrou76@users.noreply.github.com> Date: Mon, 8 Sep 2025 11:25:24 +0300 Subject: [PATCH 09/13] chore: bumps redis to 8.x (#422) * bumps Docker test container to redis 8 * bumps redis version to 8.2.1 Signed-off-by: Patroklos Papapetrou * use a previous version of go-redis Signed-off-by: Patroklos Papapetrou --------- Signed-off-by: Patroklos Papapetrou --- .github/workflows/ci-build.yaml | 2 +- manifests/base/redis/argocd-redis-deployment.yaml | 2 +- manifests/core-install-with-hydrator.yaml | 2 +- manifests/core-install.yaml | 2 +- manifests/ha/base/redis-ha/chart/upstream.yaml | 8 ++++---- manifests/ha/base/redis-ha/chart/values.yaml | 2 +- manifests/ha/install-with-hydrator.yaml | 8 ++++---- manifests/ha/install.yaml | 8 ++++---- manifests/ha/namespace-install-with-hydrator.yaml | 8 ++++---- manifests/ha/namespace-install.yaml | 8 ++++---- manifests/install-with-hydrator.yaml | 2 +- manifests/install.yaml | 2 +- manifests/namespace-install-with-hydrator.yaml | 2 +- manifests/namespace-install.yaml | 2 +- test/container/Dockerfile | 2 +- 15 files changed, 30 insertions(+), 30 deletions(-) diff --git a/.github/workflows/ci-build.yaml b/.github/workflows/ci-build.yaml index 3ad1af6e742bd..0c725c6b1ccae 100644 --- a/.github/workflows/ci-build.yaml +++ b/.github/workflows/ci-build.yaml @@ -498,7 +498,7 @@ jobs: run: | docker pull ghcr.io/dexidp/dex:v2.43.0 docker pull argoproj/argo-cd-ci-builder:v1.0.0 - docker pull redis:7.2.7-alpine + docker pull redis:8.2.1-alpine - name: Create target directory for binaries in the build-process run: | mkdir -p dist diff --git a/manifests/base/redis/argocd-redis-deployment.yaml b/manifests/base/redis/argocd-redis-deployment.yaml index 9dd65610d7280..59396108f18fa 100644 --- a/manifests/base/redis/argocd-redis-deployment.yaml +++ b/manifests/base/redis/argocd-redis-deployment.yaml @@ -40,7 +40,7 @@ spec: serviceAccountName: argocd-redis containers: - name: redis - image: redis:7.2.7-alpine + image: redis:8.2.1-alpine imagePullPolicy: Always args: - "--save" diff --git a/manifests/core-install-with-hydrator.yaml b/manifests/core-install-with-hydrator.yaml index 05891cc21c077..8d1323d92617d 100644 --- a/manifests/core-install-with-hydrator.yaml +++ b/manifests/core-install-with-hydrator.yaml @@ -24955,7 +24955,7 @@ spec: secretKeyRef: key: auth name: argocd-redis - image: public.ecr.aws/docker/library/redis:7.2.7-alpine + image: public.ecr.aws/docker/library/redis:8.2.1-alpine imagePullPolicy: Always name: redis ports: diff --git a/manifests/core-install.yaml b/manifests/core-install.yaml index 9b87fa507d2a9..6f001e8025b4e 100644 --- a/manifests/core-install.yaml +++ b/manifests/core-install.yaml @@ -24789,7 +24789,7 @@ spec: secretKeyRef: key: auth name: argocd-redis - image: public.ecr.aws/docker/library/redis:7.2.7-alpine + image: public.ecr.aws/docker/library/redis:8.2.1-alpine imagePullPolicy: Always name: redis ports: diff --git a/manifests/ha/base/redis-ha/chart/upstream.yaml b/manifests/ha/base/redis-ha/chart/upstream.yaml index ba87e074d794e..e2d8d99223dc7 100644 --- a/manifests/ha/base/redis-ha/chart/upstream.yaml +++ b/manifests/ha/base/redis-ha/chart/upstream.yaml @@ -1250,7 +1250,7 @@ spec: automountServiceAccountToken: false initContainers: - name: config-init - image: public.ecr.aws/docker/library/redis:7.2.7-alpine + image: public.ecr.aws/docker/library/redis:8.2.1-alpine imagePullPolicy: IfNotPresent resources: {} @@ -1290,7 +1290,7 @@ spec: containers: - name: redis - image: public.ecr.aws/docker/library/redis:7.2.7-alpine + image: public.ecr.aws/docker/library/redis:8.2.1-alpine imagePullPolicy: IfNotPresent command: - redis-server @@ -1364,7 +1364,7 @@ spec: - /bin/sh - /readonly-config/trigger-failover-if-master.sh - name: sentinel - image: public.ecr.aws/docker/library/redis:7.2.7-alpine + image: public.ecr.aws/docker/library/redis:8.2.1-alpine imagePullPolicy: IfNotPresent command: - redis-sentinel @@ -1437,7 +1437,7 @@ spec: - sleep 30; redis-cli -p 26379 sentinel reset argocd - name: split-brain-fix - image: public.ecr.aws/docker/library/redis:7.2.7-alpine + image: public.ecr.aws/docker/library/redis:8.2.1-alpine imagePullPolicy: IfNotPresent command: - sh diff --git a/manifests/ha/base/redis-ha/chart/values.yaml b/manifests/ha/base/redis-ha/chart/values.yaml index 22ba8c241c678..b6abd4924ce38 100644 --- a/manifests/ha/base/redis-ha/chart/values.yaml +++ b/manifests/ha/base/redis-ha/chart/values.yaml @@ -27,7 +27,7 @@ redis-ha: serviceAccount: automountToken: true image: - tag: 7.2.7-alpine + tag: 8.2.1-alpine sentinel: bind: '0.0.0.0' lifecycle: diff --git a/manifests/ha/install-with-hydrator.yaml b/manifests/ha/install-with-hydrator.yaml index 7a2099b855d13..80c06ed89ff9c 100644 --- a/manifests/ha/install-with-hydrator.yaml +++ b/manifests/ha/install-with-hydrator.yaml @@ -27799,7 +27799,7 @@ spec: secretKeyRef: key: auth name: argocd-redis - image: public.ecr.aws/docker/library/redis:7.2.7-alpine + image: public.ecr.aws/docker/library/redis:8.2.1-alpine imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -27870,7 +27870,7 @@ spec: secretKeyRef: key: auth name: argocd-redis - image: public.ecr.aws/docker/library/redis:7.2.7-alpine + image: public.ecr.aws/docker/library/redis:8.2.1-alpine imagePullPolicy: IfNotPresent lifecycle: postStart: @@ -27945,7 +27945,7 @@ spec: secretKeyRef: key: auth name: argocd-redis - image: public.ecr.aws/docker/library/redis:7.2.7-alpine + image: public.ecr.aws/docker/library/redis:8.2.1-alpine imagePullPolicy: IfNotPresent name: split-brain-fix resources: {} @@ -27980,7 +27980,7 @@ spec: secretKeyRef: key: auth name: argocd-redis - image: public.ecr.aws/docker/library/redis:7.2.7-alpine + image: public.ecr.aws/docker/library/redis:8.2.1-alpine imagePullPolicy: IfNotPresent name: config-init securityContext: diff --git a/manifests/ha/install.yaml b/manifests/ha/install.yaml index 3b6e925e5dff0..3f6a594a307cd 100644 --- a/manifests/ha/install.yaml +++ b/manifests/ha/install.yaml @@ -27635,7 +27635,7 @@ spec: secretKeyRef: key: auth name: argocd-redis - image: public.ecr.aws/docker/library/redis:7.2.7-alpine + image: public.ecr.aws/docker/library/redis:8.2.1-alpine imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -27706,7 +27706,7 @@ spec: secretKeyRef: key: auth name: argocd-redis - image: public.ecr.aws/docker/library/redis:7.2.7-alpine + image: public.ecr.aws/docker/library/redis:8.2.1-alpine imagePullPolicy: IfNotPresent lifecycle: postStart: @@ -27781,7 +27781,7 @@ spec: secretKeyRef: key: auth name: argocd-redis - image: public.ecr.aws/docker/library/redis:7.2.7-alpine + image: public.ecr.aws/docker/library/redis:8.2.1-alpine imagePullPolicy: IfNotPresent name: split-brain-fix resources: {} @@ -27816,7 +27816,7 @@ spec: secretKeyRef: key: auth name: argocd-redis - image: public.ecr.aws/docker/library/redis:7.2.7-alpine + image: public.ecr.aws/docker/library/redis:8.2.1-alpine imagePullPolicy: IfNotPresent name: config-init securityContext: diff --git a/manifests/ha/namespace-install-with-hydrator.yaml b/manifests/ha/namespace-install-with-hydrator.yaml index 3ebd2c9acc313..28228c74305b7 100644 --- a/manifests/ha/namespace-install-with-hydrator.yaml +++ b/manifests/ha/namespace-install-with-hydrator.yaml @@ -3584,7 +3584,7 @@ spec: secretKeyRef: key: auth name: argocd-redis - image: public.ecr.aws/docker/library/redis:7.2.7-alpine + image: public.ecr.aws/docker/library/redis:8.2.1-alpine imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -3655,7 +3655,7 @@ spec: secretKeyRef: key: auth name: argocd-redis - image: public.ecr.aws/docker/library/redis:7.2.7-alpine + image: public.ecr.aws/docker/library/redis:8.2.1-alpine imagePullPolicy: IfNotPresent lifecycle: postStart: @@ -3730,7 +3730,7 @@ spec: secretKeyRef: key: auth name: argocd-redis - image: public.ecr.aws/docker/library/redis:7.2.7-alpine + image: public.ecr.aws/docker/library/redis:8.2.1-alpine imagePullPolicy: IfNotPresent name: split-brain-fix resources: {} @@ -3765,7 +3765,7 @@ spec: secretKeyRef: key: auth name: argocd-redis - image: public.ecr.aws/docker/library/redis:7.2.7-alpine + image: public.ecr.aws/docker/library/redis:8.2.1-alpine imagePullPolicy: IfNotPresent name: config-init securityContext: diff --git a/manifests/ha/namespace-install.yaml b/manifests/ha/namespace-install.yaml index aca3ab9033de2..4d26565df6133 100644 --- a/manifests/ha/namespace-install.yaml +++ b/manifests/ha/namespace-install.yaml @@ -3420,7 +3420,7 @@ spec: secretKeyRef: key: auth name: argocd-redis - image: public.ecr.aws/docker/library/redis:7.2.7-alpine + image: public.ecr.aws/docker/library/redis:8.2.1-alpine imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -3491,7 +3491,7 @@ spec: secretKeyRef: key: auth name: argocd-redis - image: public.ecr.aws/docker/library/redis:7.2.7-alpine + image: public.ecr.aws/docker/library/redis:8.2.1-alpine imagePullPolicy: IfNotPresent lifecycle: postStart: @@ -3566,7 +3566,7 @@ spec: secretKeyRef: key: auth name: argocd-redis - image: public.ecr.aws/docker/library/redis:7.2.7-alpine + image: public.ecr.aws/docker/library/redis:8.2.1-alpine imagePullPolicy: IfNotPresent name: split-brain-fix resources: {} @@ -3601,7 +3601,7 @@ spec: secretKeyRef: key: auth name: argocd-redis - image: public.ecr.aws/docker/library/redis:7.2.7-alpine + image: public.ecr.aws/docker/library/redis:8.2.1-alpine imagePullPolicy: IfNotPresent name: config-init securityContext: diff --git a/manifests/install-with-hydrator.yaml b/manifests/install-with-hydrator.yaml index c0871ef41261c..740f2807e2ddc 100644 --- a/manifests/install-with-hydrator.yaml +++ b/manifests/install-with-hydrator.yaml @@ -25636,7 +25636,7 @@ spec: secretKeyRef: key: auth name: argocd-redis - image: public.ecr.aws/docker/library/redis:7.2.7-alpine + image: public.ecr.aws/docker/library/redis:8.2.1-alpine imagePullPolicy: Always name: redis ports: diff --git a/manifests/install.yaml b/manifests/install.yaml index 2bce038c02961..f5eb198868d88 100644 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -25470,7 +25470,7 @@ spec: secretKeyRef: key: auth name: argocd-redis - image: public.ecr.aws/docker/library/redis:7.2.7-alpine + image: public.ecr.aws/docker/library/redis:8.2.1-alpine imagePullPolicy: Always name: redis ports: diff --git a/manifests/namespace-install-with-hydrator.yaml b/manifests/namespace-install-with-hydrator.yaml index c71f00e31441e..cd10a3bfff593 100644 --- a/manifests/namespace-install-with-hydrator.yaml +++ b/manifests/namespace-install-with-hydrator.yaml @@ -1421,7 +1421,7 @@ spec: secretKeyRef: key: auth name: argocd-redis - image: public.ecr.aws/docker/library/redis:7.2.7-alpine + image: public.ecr.aws/docker/library/redis:8.2.1-alpine imagePullPolicy: Always name: redis ports: diff --git a/manifests/namespace-install.yaml b/manifests/namespace-install.yaml index 45e5b0d97366c..ca2eb94c9aa3a 100644 --- a/manifests/namespace-install.yaml +++ b/manifests/namespace-install.yaml @@ -1255,7 +1255,7 @@ spec: secretKeyRef: key: auth name: argocd-redis - image: public.ecr.aws/docker/library/redis:7.2.7-alpine + image: public.ecr.aws/docker/library/redis:8.2.1-alpine imagePullPolicy: Always name: redis ports: diff --git a/test/container/Dockerfile b/test/container/Dockerfile index 47d2f79dccfe7..ccf9b935fc3af 100644 --- a/test/container/Dockerfile +++ b/test/container/Dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/library/redis:7.4.3@sha256:7df1eeff67eb0ba84f6b9d2940765a6bb1158081426745c185a03b1507de6a09 AS redis +FROM docker.io/library/redis:8.2.1@sha256:cc2dfb8f5151da2684b4a09bd04b567f92d07591d91980eb3eca21df07e12760 AS redis # There are libraries we will want to copy from here in the final stage of the # build, but the COPY directive does not have a way to determine system From f657dea4a155184fc27eba384a1c6c0079ea8519 Mon Sep 17 00:00:00 2001 From: Papapetrou Patroklos <1743100+ppapapetrou76@users.noreply.github.com> Date: Tue, 9 Sep 2025 11:55:08 +0300 Subject: [PATCH 10/13] upgrade sqlite in docker image to address CVE-2025-6965 (#425) --- Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Dockerfile b/Dockerfile index 91a4e410444d3..c87a7e2ffaef6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -55,6 +55,9 @@ RUN groupadd -g $ARGOCD_USER_ID argocd && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* +# To make sure that the latesst version of sqlite is installed that addresses this CVE-2025-6965 +RUN apt update && apt install --only-upgrade libsqlite3-0 + COPY hack/gpg-wrapper.sh \ hack/git-verify-wrapper.sh \ entrypoint.sh \ From 5281363b4b5c6e5314217a5482765417e9e974f8 Mon Sep 17 00:00:00 2001 From: Patroklos Papapetrou Date: Tue, 16 Sep 2025 17:56:54 +0300 Subject: [PATCH 11/13] final changes after rebase Signed-off-by: Patroklos Papapetrou --- .../services/pull_request/bitbucket_server.go | 1 + pkg/apis/application/v1alpha1/generated.pb.go | 1574 +++++++++-------- 2 files changed, 804 insertions(+), 771 deletions(-) diff --git a/applicationset/services/pull_request/bitbucket_server.go b/applicationset/services/pull_request/bitbucket_server.go index 7b004050baf4a..264e9c08fd5aa 100644 --- a/applicationset/services/pull_request/bitbucket_server.go +++ b/applicationset/services/pull_request/bitbucket_server.go @@ -3,6 +3,7 @@ package pull_request import ( "context" "fmt" + "net/http" bitbucketv1 "github.com/gfleury/go-bitbucket-v1" log "github.com/sirupsen/logrus" diff --git a/pkg/apis/application/v1alpha1/generated.pb.go b/pkg/apis/application/v1alpha1/generated.pb.go index 2a080bad4ba3f..0874ab5ae3455 100644 --- a/pkg/apis/application/v1alpha1/generated.pb.go +++ b/pkg/apis/application/v1alpha1/generated.pb.go @@ -4914,777 +4914,779 @@ func init() { } var fileDescriptor_c078c3c476799f44 = []byte{ - // 12308 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x24, 0xc7, - 0x75, 0x98, 0x66, 0x17, 0x0b, 0xec, 0x3e, 0x7c, 0x1d, 0xfa, 0xee, 0x48, 0xdc, 0xf1, 0x03, 0xe7, - 0xa1, 0x4c, 0xd1, 0x11, 0x09, 0x98, 0x47, 0x52, 0x66, 0x4c, 0x5b, 0x36, 0x3e, 0xee, 0x03, 0x77, - 0xc0, 0x01, 0xec, 0xc5, 0xdd, 0x59, 0x94, 0x29, 0x6a, 0xb0, 0xdb, 0x58, 0xcc, 0x61, 0x76, 0x66, - 0x39, 0x33, 0x8b, 0xc3, 0xd2, 0xb2, 0x2c, 0x59, 0x92, 0x2d, 0x5b, 0x5f, 0x8c, 0xed, 0x8a, 0xa8, - 0x24, 0x52, 0xe4, 0xd8, 0xf9, 0xaa, 0x94, 0xca, 0x4a, 0xfc, 0x23, 0xae, 0xd8, 0x2e, 0x95, 0xed, - 0x94, 0x4a, 0x8e, 0x93, 0xb2, 0xa3, 0x52, 0x2c, 0x27, 0xb6, 0x10, 0xe9, 0x92, 0x94, 0x5c, 0xa9, - 0x8a, 0xab, 0xec, 0xe4, 0x47, 0xea, 0x92, 0x4a, 0xa5, 0xfa, 0xbb, 0x67, 0x76, 0x16, 0x58, 0x1c, - 0x06, 0x77, 0x27, 0x99, 0xff, 0x76, 0xfb, 0xbd, 0x79, 0xaf, 0xa7, 0xa7, 0xfb, 0xbd, 0xd7, 0xaf, - 0xdf, 0x7b, 0x0d, 0x4b, 0x0d, 0x37, 0xde, 0x6c, 0xaf, 0x4f, 0xd7, 0x82, 0xe6, 0x8c, 0x13, 0x36, - 0x82, 0x56, 0x18, 0xdc, 0x60, 0x3f, 0x9e, 0xaa, 0xd5, 0x67, 0xb6, 0x9f, 0x99, 0x69, 0x6d, 0x35, - 0x66, 0x9c, 0x96, 0x1b, 0xcd, 0x38, 0xad, 0x96, 0xe7, 0xd6, 0x9c, 0xd8, 0x0d, 0xfc, 0x99, 0xed, - 0xa7, 0x1d, 0xaf, 0xb5, 0xe9, 0x3c, 0x3d, 0xd3, 0x20, 0x3e, 0x09, 0x9d, 0x98, 0xd4, 0xa7, 0x5b, - 0x61, 0x10, 0x07, 0xe8, 0x87, 0x34, 0xb5, 0x69, 0x49, 0x8d, 0xfd, 0x78, 0xa5, 0x56, 0x9f, 0xde, - 0x7e, 0x66, 0xba, 0xb5, 0xd5, 0x98, 0xa6, 0xd4, 0xa6, 0x0d, 0x6a, 0xd3, 0x92, 0xda, 0xe9, 0xa7, - 0x8c, 0xbe, 0x34, 0x82, 0x46, 0x30, 0xc3, 0x88, 0xae, 0xb7, 0x37, 0xd8, 0x3f, 0xf6, 0x87, 0xfd, - 0xe2, 0xcc, 0x4e, 0xdb, 0x5b, 0xcf, 0x47, 0xd3, 0x6e, 0x40, 0xbb, 0x37, 0x53, 0x0b, 0x42, 0x32, - 0xb3, 0xdd, 0xd5, 0xa1, 0xd3, 0x17, 0x35, 0x0e, 0xd9, 0x89, 0x89, 0x1f, 0xb9, 0x81, 0x1f, 0x3d, - 0x45, 0xbb, 0x40, 0xc2, 0x6d, 0x12, 0x9a, 0xaf, 0x67, 0x20, 0x64, 0x51, 0x7a, 0x56, 0x53, 0x6a, - 0x3a, 0xb5, 0x4d, 0xd7, 0x27, 0x61, 0x47, 0x3f, 0xde, 0x24, 0xb1, 0x93, 0xf5, 0xd4, 0x4c, 0xaf, - 0xa7, 0xc2, 0xb6, 0x1f, 0xbb, 0x4d, 0xd2, 0xf5, 0xc0, 0x3b, 0xf6, 0x7b, 0x20, 0xaa, 0x6d, 0x92, - 0xa6, 0xd3, 0xf5, 0xdc, 0x33, 0xbd, 0x9e, 0x6b, 0xc7, 0xae, 0x37, 0xe3, 0xfa, 0x71, 0x14, 0x87, - 0xe9, 0x87, 0xec, 0xbf, 0x67, 0xc1, 0xe8, 0xec, 0xf5, 0xea, 0x6c, 0x3b, 0xde, 0x9c, 0x0f, 0xfc, - 0x0d, 0xb7, 0x81, 0x9e, 0x83, 0xe1, 0x9a, 0xd7, 0x8e, 0x62, 0x12, 0x5e, 0x71, 0x9a, 0x64, 0xd2, - 0x3a, 0x63, 0x3d, 0x51, 0x99, 0x3b, 0xfe, 0x95, 0xdd, 0xa9, 0xb7, 0xdc, 0xda, 0x9d, 0x1a, 0x9e, - 0xd7, 0x20, 0x6c, 0xe2, 0xa1, 0xef, 0x83, 0xa1, 0x30, 0xf0, 0xc8, 0x2c, 0xbe, 0x32, 0x59, 0x60, - 0x8f, 0x8c, 0x8b, 0x47, 0x86, 0x30, 0x6f, 0xc6, 0x12, 0x4e, 0x51, 0x5b, 0x61, 0xb0, 0xe1, 0x7a, - 0x64, 0xb2, 0x98, 0x44, 0x5d, 0xe5, 0xcd, 0x58, 0xc2, 0xed, 0xcf, 0x14, 0x60, 0x7c, 0xb6, 0xd5, - 0xba, 0x48, 0x1c, 0x2f, 0xde, 0xac, 0xc6, 0x4e, 0xdc, 0x8e, 0x50, 0x03, 0x06, 0x23, 0xf6, 0x4b, - 0xf4, 0x6d, 0x45, 0x3c, 0x3d, 0xc8, 0xe1, 0xb7, 0x77, 0xa7, 0x7e, 0x38, 0x6b, 0x46, 0x37, 0xdc, - 0x38, 0x68, 0x45, 0x4f, 0x11, 0xbf, 0xe1, 0xfa, 0x84, 0x8d, 0xcb, 0x26, 0xa3, 0x3a, 0x6d, 0x12, - 0x9f, 0x0f, 0xea, 0x04, 0x0b, 0xf2, 0xb4, 0x9f, 0x4d, 0x12, 0x45, 0x4e, 0x83, 0xa4, 0x5f, 0x69, - 0x99, 0x37, 0x63, 0x09, 0x47, 0x21, 0x20, 0xcf, 0x89, 0xe2, 0xb5, 0xd0, 0xf1, 0x23, 0x97, 0x4e, - 0xe9, 0x35, 0xb7, 0xc9, 0xdf, 0x6e, 0xf8, 0xec, 0xdf, 0x98, 0xe6, 0x1f, 0x66, 0xda, 0xfc, 0x30, - 0x7a, 0x1d, 0xd0, 0x79, 0x33, 0xbd, 0xfd, 0xf4, 0x34, 0x7d, 0x62, 0xee, 0x81, 0x5b, 0xbb, 0x53, - 0x68, 0xa9, 0x8b, 0x12, 0xce, 0xa0, 0x6e, 0xff, 0x71, 0x01, 0x60, 0xb6, 0xd5, 0x5a, 0x0d, 0x83, - 0x1b, 0xa4, 0x16, 0xa3, 0xf7, 0x42, 0x99, 0x92, 0xaa, 0x3b, 0xb1, 0xc3, 0x06, 0x66, 0xf8, 0xec, - 0xf7, 0xf7, 0xc7, 0x78, 0x65, 0x9d, 0x3e, 0xbf, 0x4c, 0x62, 0x67, 0x0e, 0x89, 0x17, 0x04, 0xdd, - 0x86, 0x15, 0x55, 0xe4, 0xc3, 0x40, 0xd4, 0x22, 0x35, 0x36, 0x18, 0xc3, 0x67, 0x97, 0xa6, 0x0f, - 0xb3, 0xd2, 0xa7, 0x75, 0xcf, 0xab, 0x2d, 0x52, 0x9b, 0x1b, 0x11, 0x9c, 0x07, 0xe8, 0x3f, 0xcc, - 0xf8, 0xa0, 0x6d, 0xf5, 0xa1, 0xf9, 0x40, 0x5e, 0xc9, 0x8d, 0x23, 0xa3, 0x3a, 0x37, 0x96, 0x9c, - 0x38, 0xf2, 0xbb, 0xdb, 0xdf, 0xb0, 0x60, 0x4c, 0x23, 0x2f, 0xb9, 0x51, 0x8c, 0x7e, 0xbc, 0x6b, - 0x70, 0xa7, 0xfb, 0x1b, 0x5c, 0xfa, 0x34, 0x1b, 0xda, 0x63, 0x82, 0x59, 0x59, 0xb6, 0x18, 0x03, - 0xdb, 0x84, 0x92, 0x1b, 0x93, 0x66, 0x34, 0x59, 0x38, 0x53, 0x7c, 0x62, 0xf8, 0xec, 0xc5, 0xbc, - 0xde, 0x73, 0x6e, 0x54, 0x30, 0x2d, 0x2d, 0x52, 0xf2, 0x98, 0x73, 0xb1, 0xff, 0x6a, 0xd4, 0x7c, - 0x3f, 0x3a, 0xe0, 0xe8, 0x69, 0x18, 0x8e, 0x82, 0x76, 0x58, 0x23, 0x98, 0xb4, 0x02, 0xba, 0xb0, - 0x8a, 0x74, 0xba, 0xd3, 0x05, 0x5f, 0xd5, 0xcd, 0xd8, 0xc4, 0x41, 0x9f, 0xb4, 0x60, 0xa4, 0x4e, - 0xa2, 0xd8, 0xf5, 0x19, 0x7f, 0xd9, 0xf9, 0xb5, 0x43, 0x77, 0x5e, 0x36, 0x2e, 0x68, 0xe2, 0x73, - 0x27, 0xc4, 0x8b, 0x8c, 0x18, 0x8d, 0x11, 0x4e, 0xf0, 0xa7, 0x82, 0xab, 0x4e, 0xa2, 0x5a, 0xe8, - 0xb6, 0xe8, 0x7f, 0x21, 0x5a, 0x94, 0xe0, 0x5a, 0xd0, 0x20, 0x6c, 0xe2, 0x21, 0x1f, 0x4a, 0x54, - 0x30, 0x45, 0x93, 0x03, 0xac, 0xff, 0x8b, 0x87, 0xeb, 0xbf, 0x18, 0x54, 0x2a, 0xf3, 0xf4, 0xe8, - 0xd3, 0x7f, 0x11, 0xe6, 0x6c, 0xd0, 0x27, 0x2c, 0x98, 0x14, 0x82, 0x13, 0x13, 0x3e, 0xa0, 0xd7, - 0x37, 0xdd, 0x98, 0x78, 0x6e, 0x14, 0x4f, 0x96, 0x58, 0x1f, 0x66, 0xfa, 0x9b, 0x5b, 0x17, 0xc2, - 0xa0, 0xdd, 0xba, 0xec, 0xfa, 0xf5, 0xb9, 0x33, 0x82, 0xd3, 0xe4, 0x7c, 0x0f, 0xc2, 0xb8, 0x27, - 0x4b, 0xf4, 0x8b, 0x16, 0x9c, 0xf6, 0x9d, 0x26, 0x89, 0x5a, 0x0e, 0xfd, 0xb4, 0x1c, 0x3c, 0xe7, - 0x39, 0xb5, 0x2d, 0xd6, 0xa3, 0xc1, 0x3b, 0xeb, 0x91, 0x2d, 0x7a, 0x74, 0xfa, 0x4a, 0x4f, 0xd2, - 0x78, 0x0f, 0xb6, 0xe8, 0x57, 0x2c, 0x98, 0x08, 0xc2, 0xd6, 0xa6, 0xe3, 0x93, 0xba, 0x84, 0x46, - 0x93, 0x43, 0x6c, 0xe9, 0xbd, 0xe7, 0x70, 0x9f, 0x68, 0x25, 0x4d, 0x76, 0x39, 0xf0, 0xdd, 0x38, - 0x08, 0xab, 0x24, 0x8e, 0x5d, 0xbf, 0x11, 0xcd, 0x9d, 0xbc, 0xb5, 0x3b, 0x35, 0xd1, 0x85, 0x85, - 0xbb, 0xfb, 0x83, 0x7e, 0x02, 0x86, 0xa3, 0x8e, 0x5f, 0xbb, 0xee, 0xfa, 0xf5, 0xe0, 0x66, 0x34, - 0x59, 0xce, 0x63, 0xf9, 0x56, 0x15, 0x41, 0xb1, 0x00, 0x35, 0x03, 0x6c, 0x72, 0xcb, 0xfe, 0x70, - 0x7a, 0x2a, 0x55, 0xf2, 0xfe, 0x70, 0x7a, 0x32, 0xed, 0xc1, 0x16, 0xfd, 0xac, 0x05, 0xa3, 0x91, - 0xdb, 0xf0, 0x9d, 0xb8, 0x1d, 0x92, 0xcb, 0xa4, 0x13, 0x4d, 0x02, 0xeb, 0xc8, 0xa5, 0x43, 0x8e, - 0x8a, 0x41, 0x72, 0xee, 0xa4, 0xe8, 0xe3, 0xa8, 0xd9, 0x1a, 0xe1, 0x24, 0xdf, 0xac, 0x85, 0xa6, - 0xa7, 0xf5, 0x70, 0xbe, 0x0b, 0x4d, 0x4f, 0xea, 0x9e, 0x2c, 0xd1, 0x8f, 0xc2, 0x31, 0xde, 0xa4, - 0x46, 0x36, 0x9a, 0x1c, 0x61, 0x82, 0xf6, 0xc4, 0xad, 0xdd, 0xa9, 0x63, 0xd5, 0x14, 0x0c, 0x77, - 0x61, 0xa3, 0x57, 0x61, 0xaa, 0x45, 0xc2, 0xa6, 0x1b, 0xaf, 0xf8, 0x5e, 0x47, 0x8a, 0xef, 0x5a, - 0xd0, 0x22, 0x75, 0xd1, 0x9d, 0x68, 0x72, 0xf4, 0x8c, 0xf5, 0x44, 0x79, 0xee, 0x6d, 0xa2, 0x9b, - 0x53, 0xab, 0x7b, 0xa3, 0xe3, 0xfd, 0xe8, 0xa1, 0x2f, 0x5b, 0x70, 0xda, 0x90, 0xb2, 0x55, 0x12, - 0x6e, 0xbb, 0x35, 0x32, 0x5b, 0xab, 0x05, 0x6d, 0x3f, 0x8e, 0x26, 0xc7, 0xd8, 0x30, 0xae, 0x1f, - 0x85, 0xcc, 0x4f, 0xb2, 0xd2, 0xf3, 0xb2, 0x27, 0x4a, 0x84, 0xf7, 0xe8, 0xa9, 0xfd, 0xfb, 0x05, - 0x38, 0x96, 0xb6, 0x00, 0xd0, 0x3f, 0xb2, 0x60, 0xfc, 0xc6, 0xcd, 0x78, 0x2d, 0xd8, 0x22, 0x7e, - 0x34, 0xd7, 0xa1, 0x72, 0x9a, 0xe9, 0xbe, 0xe1, 0xb3, 0xb5, 0x7c, 0x6d, 0x8d, 0xe9, 0x4b, 0x49, - 0x2e, 0xe7, 0xfc, 0x38, 0xec, 0xcc, 0x3d, 0x28, 0xde, 0x69, 0xfc, 0xd2, 0xf5, 0x35, 0x13, 0x8a, - 0xd3, 0x9d, 0x3a, 0xfd, 0x31, 0x0b, 0x4e, 0x64, 0x91, 0x40, 0xc7, 0xa0, 0xb8, 0x45, 0x3a, 0xdc, - 0x12, 0xc6, 0xf4, 0x27, 0x7a, 0x19, 0x4a, 0xdb, 0x8e, 0xd7, 0x26, 0xc2, 0x4c, 0xbb, 0x70, 0xb8, - 0x17, 0x51, 0x3d, 0xc3, 0x9c, 0xea, 0x0f, 0x16, 0x9e, 0xb7, 0xec, 0x3f, 0x2c, 0xc2, 0xb0, 0xf1, - 0xd1, 0xee, 0x82, 0xe9, 0x19, 0x24, 0x4c, 0xcf, 0xe5, 0xdc, 0xe6, 0x5b, 0x4f, 0xdb, 0xf3, 0x66, - 0xca, 0xf6, 0x5c, 0xc9, 0x8f, 0xe5, 0x9e, 0xc6, 0x27, 0x8a, 0xa1, 0x12, 0xb4, 0xe8, 0x16, 0x8d, - 0xda, 0x30, 0x03, 0x79, 0x7c, 0xc2, 0x15, 0x49, 0x6e, 0x6e, 0xf4, 0xd6, 0xee, 0x54, 0x45, 0xfd, - 0xc5, 0x9a, 0x91, 0xfd, 0x75, 0x0b, 0x4e, 0x18, 0x7d, 0x9c, 0x0f, 0xfc, 0x3a, 0xdb, 0x68, 0xa0, - 0x33, 0x30, 0x10, 0x77, 0x5a, 0x72, 0x1b, 0xa8, 0x46, 0x6a, 0xad, 0xd3, 0x22, 0x98, 0x41, 0xee, - 0xf7, 0x5d, 0xd2, 0x2f, 0x5a, 0xf0, 0x40, 0xb6, 0x80, 0x41, 0x8f, 0xc3, 0x20, 0xf7, 0x01, 0x88, - 0xb7, 0xd3, 0x9f, 0x84, 0xb5, 0x62, 0x01, 0x45, 0x33, 0x50, 0x51, 0x0a, 0x4f, 0xbc, 0xe3, 0x84, - 0x40, 0xad, 0x68, 0x2d, 0xa9, 0x71, 0xe8, 0xa0, 0xd1, 0x3f, 0xc2, 0x04, 0x55, 0x83, 0xc6, 0x36, - 0xcd, 0x0c, 0x62, 0x7f, 0xcd, 0x82, 0xb7, 0xf6, 0x23, 0xf6, 0x8e, 0xae, 0x8f, 0x55, 0x38, 0x59, - 0x27, 0x1b, 0x4e, 0xdb, 0x8b, 0x93, 0x1c, 0x45, 0xa7, 0x1f, 0x11, 0x0f, 0x9f, 0x5c, 0xc8, 0x42, - 0xc2, 0xd9, 0xcf, 0xda, 0xff, 0xd9, 0x62, 0xdb, 0x75, 0xf9, 0x5a, 0x77, 0x61, 0xeb, 0xe4, 0x27, - 0xb7, 0x4e, 0x8b, 0xb9, 0x2d, 0xd3, 0x1e, 0x7b, 0xa7, 0x4f, 0x58, 0x70, 0xda, 0xc0, 0x5a, 0x76, - 0xe2, 0xda, 0xe6, 0xb9, 0x9d, 0x56, 0x48, 0xa2, 0x88, 0x4e, 0xa9, 0x47, 0x0c, 0x71, 0x3c, 0x37, - 0x2c, 0x28, 0x14, 0x2f, 0x93, 0x0e, 0x97, 0xcd, 0x4f, 0x42, 0x99, 0xaf, 0xb9, 0x20, 0x14, 0x1f, - 0x49, 0xbd, 0xdb, 0x8a, 0x68, 0xc7, 0x0a, 0x03, 0xd9, 0x30, 0xc8, 0x64, 0x2e, 0x95, 0x41, 0xd4, - 0x4c, 0x00, 0xfa, 0xdd, 0xaf, 0xb1, 0x16, 0x2c, 0x20, 0x76, 0x94, 0xe8, 0xce, 0x6a, 0x48, 0xd8, - 0x7c, 0xa8, 0x9f, 0x77, 0x89, 0x57, 0x8f, 0xe8, 0xb6, 0xce, 0xf1, 0xfd, 0x20, 0x16, 0x3b, 0x34, - 0x63, 0x5b, 0x37, 0xab, 0x9b, 0xb1, 0x89, 0x43, 0x99, 0x7a, 0xce, 0x3a, 0xf1, 0xf8, 0x88, 0x0a, - 0xa6, 0x4b, 0xac, 0x05, 0x0b, 0x88, 0x7d, 0xab, 0xc0, 0x36, 0x90, 0x4a, 0xa2, 0x91, 0xbb, 0xe1, - 0x7d, 0x08, 0x13, 0x2a, 0x60, 0x35, 0x3f, 0x79, 0x4c, 0x7a, 0x7b, 0x20, 0x5e, 0x4b, 0x69, 0x01, - 0x9c, 0x2b, 0xd7, 0xbd, 0xbd, 0x10, 0x1f, 0x28, 0xc2, 0x54, 0xf2, 0x81, 0x2e, 0x25, 0x42, 0xb7, - 0xbc, 0x06, 0xa3, 0xb4, 0xaf, 0xce, 0xc0, 0xc7, 0x26, 0x5e, 0x0f, 0x39, 0x5c, 0x38, 0x4a, 0x39, - 0x6c, 0xaa, 0x89, 0xe2, 0x3e, 0x6a, 0xe2, 0x71, 0x35, 0xea, 0x03, 0x29, 0x99, 0x97, 0x54, 0x95, - 0x67, 0x60, 0x20, 0x8a, 0x49, 0x6b, 0xb2, 0x94, 0x14, 0xb3, 0xd5, 0x98, 0xb4, 0x30, 0x83, 0xa0, - 0x1f, 0x86, 0xf1, 0xd8, 0x09, 0x1b, 0x24, 0x0e, 0xc9, 0xb6, 0xcb, 0xfc, 0xba, 0x6c, 0x3f, 0x5b, - 0x99, 0x3b, 0x4e, 0xad, 0xae, 0x35, 0x06, 0xc2, 0x12, 0x84, 0xd3, 0xb8, 0xf6, 0x7f, 0x2f, 0xc0, - 0x83, 0xc9, 0x4f, 0xa0, 0x15, 0xe3, 0x8f, 0x24, 0x14, 0xe3, 0xdb, 0x4d, 0xc5, 0x78, 0x7b, 0x77, - 0xea, 0xa1, 0x1e, 0x8f, 0x7d, 0xc7, 0xe8, 0x4d, 0x74, 0x21, 0xf5, 0x11, 0x66, 0xba, 0xbc, 0xac, - 0x8f, 0xf4, 0x78, 0xc7, 0xd4, 0x57, 0x7a, 0x1c, 0x06, 0x43, 0xe2, 0x44, 0x81, 0x2f, 0xbe, 0x93, - 0xfa, 0x9a, 0x98, 0xb5, 0x62, 0x01, 0xb5, 0xbf, 0x5a, 0x49, 0x0f, 0xf6, 0x05, 0xee, 0xab, 0x0e, - 0x42, 0xe4, 0xc2, 0x00, 0xdb, 0xb5, 0x71, 0xc9, 0x72, 0xf9, 0x70, 0xab, 0x90, 0x6a, 0x11, 0x45, - 0x7a, 0xae, 0x4c, 0xbf, 0x1a, 0x6d, 0xc2, 0x8c, 0x05, 0xda, 0x81, 0x72, 0x4d, 0x6e, 0xa6, 0x0a, - 0x79, 0xb8, 0x1d, 0xc5, 0x56, 0x4a, 0x73, 0x1c, 0xa1, 0xe2, 0x5e, 0xed, 0xc0, 0x14, 0x37, 0x44, - 0xa0, 0xd8, 0x70, 0x63, 0xf1, 0x59, 0x0f, 0xb9, 0x5d, 0xbe, 0xe0, 0x1a, 0xaf, 0x38, 0x44, 0x75, - 0xd0, 0x05, 0x37, 0xc6, 0x94, 0x3e, 0xfa, 0x88, 0x05, 0xc3, 0x51, 0xad, 0xb9, 0x1a, 0x06, 0xdb, - 0x6e, 0x9d, 0x84, 0xc2, 0xc6, 0x3c, 0xa4, 0x64, 0xab, 0xce, 0x2f, 0x4b, 0x82, 0x9a, 0x2f, 0x77, - 0x5f, 0x68, 0x08, 0x36, 0xf9, 0xd2, 0xbd, 0xd7, 0x83, 0xe2, 0xdd, 0x17, 0x48, 0x8d, 0xad, 0x38, - 0xb9, 0x67, 0x66, 0x33, 0xe5, 0xd0, 0x36, 0xf7, 0x42, 0xbb, 0xb6, 0x45, 0xd7, 0x9b, 0xee, 0xd0, - 0x43, 0xb7, 0x76, 0xa7, 0x1e, 0x9c, 0xcf, 0xe6, 0x89, 0x7b, 0x75, 0x86, 0x0d, 0x58, 0xab, 0xed, - 0x79, 0x98, 0xbc, 0xda, 0x26, 0xcc, 0x23, 0x96, 0xc3, 0x80, 0xad, 0x6a, 0x82, 0xa9, 0x01, 0x33, - 0x20, 0xd8, 0xe4, 0x8b, 0x5e, 0x85, 0xc1, 0xa6, 0x13, 0x87, 0xee, 0x8e, 0x70, 0x83, 0x1d, 0x72, - 0x17, 0xb4, 0xcc, 0x68, 0x69, 0xe6, 0x4c, 0xd1, 0xf3, 0x46, 0x2c, 0x18, 0xa1, 0x26, 0x94, 0x9a, - 0x24, 0x6c, 0x90, 0xc9, 0x72, 0x1e, 0x2e, 0xff, 0x65, 0x4a, 0x4a, 0x33, 0xac, 0x50, 0xe3, 0x8a, - 0xb5, 0x61, 0xce, 0x05, 0xbd, 0x0c, 0xe5, 0x88, 0x78, 0xa4, 0x46, 0xcd, 0xa3, 0x0a, 0xe3, 0xf8, - 0x4c, 0x9f, 0xa6, 0x22, 0xb5, 0x4b, 0xaa, 0xe2, 0x51, 0xbe, 0xc0, 0xe4, 0x3f, 0xac, 0x48, 0xd2, - 0x01, 0x6c, 0x79, 0xed, 0x86, 0xeb, 0x4f, 0x42, 0x1e, 0x03, 0xb8, 0xca, 0x68, 0xa5, 0x06, 0x90, - 0x37, 0x62, 0xc1, 0xc8, 0xfe, 0x6f, 0x16, 0xa0, 0xa4, 0x50, 0xbb, 0x0b, 0x36, 0xf1, 0xab, 0x49, - 0x9b, 0x78, 0x29, 0x4f, 0xa3, 0xa5, 0x87, 0x59, 0xfc, 0x9b, 0x15, 0x48, 0xa9, 0x83, 0x2b, 0x24, - 0x8a, 0x49, 0xfd, 0x4d, 0x11, 0xfe, 0xa6, 0x08, 0x7f, 0x53, 0x84, 0x2b, 0x11, 0xbe, 0x9e, 0x12, - 0xe1, 0xef, 0x34, 0x56, 0xbd, 0x8e, 0x3d, 0x78, 0x45, 0x05, 0x27, 0x98, 0x3d, 0x30, 0x10, 0xa8, - 0x24, 0xb8, 0x54, 0x5d, 0xb9, 0x92, 0x29, 0xb3, 0x5f, 0x49, 0xca, 0xec, 0xc3, 0xb2, 0xf8, 0xeb, - 0x20, 0xa5, 0xbf, 0x6c, 0xc1, 0xdb, 0x92, 0xd2, 0x4b, 0xce, 0x9c, 0xc5, 0x86, 0x1f, 0x84, 0x64, - 0xc1, 0xdd, 0xd8, 0x20, 0x21, 0xf1, 0x6b, 0x24, 0x52, 0xbe, 0x1d, 0xab, 0x97, 0x6f, 0x07, 0x3d, - 0x0b, 0x23, 0x37, 0xa2, 0xc0, 0x5f, 0x0d, 0x5c, 0x5f, 0x88, 0x20, 0xba, 0xe3, 0x38, 0x76, 0x6b, - 0x77, 0x6a, 0x84, 0x8e, 0xa8, 0x6c, 0xc7, 0x09, 0x2c, 0x34, 0x0f, 0x13, 0x37, 0x5e, 0x5d, 0x75, - 0x62, 0xc3, 0x9b, 0x20, 0xf7, 0xfd, 0xec, 0x3c, 0xea, 0xd2, 0x8b, 0x29, 0x20, 0xee, 0xc6, 0xb7, - 0xff, 0x6e, 0x01, 0x4e, 0xa5, 0x5e, 0x24, 0xf0, 0xbc, 0xa0, 0x1d, 0xd3, 0x3d, 0x11, 0xfa, 0x9c, - 0x05, 0xc7, 0x9a, 0x49, 0x87, 0x45, 0x24, 0xdc, 0xdd, 0x3f, 0x96, 0x9b, 0x8e, 0x48, 0x79, 0x44, - 0xe6, 0x26, 0xc5, 0x08, 0x1d, 0x4b, 0x01, 0x22, 0xdc, 0xd5, 0x17, 0xf4, 0x32, 0x54, 0x9a, 0xce, - 0xce, 0xd5, 0x56, 0xdd, 0x89, 0xe5, 0x76, 0xb4, 0xb7, 0x17, 0xa1, 0x1d, 0xbb, 0xde, 0x34, 0x8f, - 0x6a, 0x99, 0x5e, 0xf4, 0xe3, 0x95, 0xb0, 0x1a, 0x87, 0xae, 0xdf, 0xe0, 0x4e, 0xce, 0x65, 0x49, - 0x06, 0x6b, 0x8a, 0xf6, 0x67, 0xad, 0xb4, 0x92, 0x52, 0xa3, 0x13, 0x3a, 0x31, 0x69, 0x74, 0xd0, - 0xfb, 0xa0, 0x44, 0xf7, 0x8d, 0x72, 0x54, 0xae, 0xe7, 0xa9, 0x39, 0x8d, 0x2f, 0xa1, 0x95, 0x28, - 0xfd, 0x17, 0x61, 0xce, 0xd4, 0xfe, 0x5c, 0x25, 0x6d, 0x2c, 0xb0, 0xb3, 0xf9, 0xb3, 0x00, 0x8d, - 0x60, 0x8d, 0x34, 0x5b, 0x1e, 0x1d, 0x16, 0x8b, 0x1d, 0xf0, 0x28, 0x57, 0xc9, 0x05, 0x05, 0xc1, - 0x06, 0x16, 0xfa, 0x39, 0x0b, 0xa0, 0x21, 0xe7, 0xbc, 0x34, 0x04, 0xae, 0xe6, 0xf9, 0x3a, 0x7a, - 0x45, 0xe9, 0xbe, 0x28, 0x86, 0xd8, 0x60, 0x8e, 0x7e, 0xda, 0x82, 0x72, 0x2c, 0xbb, 0xcf, 0x55, - 0xe3, 0x5a, 0x9e, 0x3d, 0x91, 0x2f, 0xad, 0x6d, 0x22, 0x35, 0x24, 0x8a, 0x2f, 0xfa, 0x19, 0x0b, - 0x20, 0xea, 0xf8, 0xb5, 0xd5, 0xc0, 0x73, 0x6b, 0x1d, 0xa1, 0x31, 0xaf, 0xe5, 0xea, 0xce, 0x51, - 0xd4, 0xe7, 0xc6, 0xe8, 0x68, 0xe8, 0xff, 0xd8, 0xe0, 0x8c, 0xde, 0x0f, 0xe5, 0x48, 0x4c, 0x37, - 0xa1, 0x23, 0xd7, 0xf2, 0x75, 0x2a, 0x71, 0xda, 0x42, 0xbc, 0x8a, 0x7f, 0x58, 0xf1, 0x44, 0x9f, - 0xb6, 0x60, 0xbc, 0x95, 0x74, 0x13, 0x0a, 0x75, 0x98, 0x9f, 0x0c, 0x48, 0xb9, 0x21, 0xb9, 0xb7, - 0x25, 0xd5, 0x88, 0xd3, 0xbd, 0xa0, 0x12, 0x50, 0xcf, 0xe0, 0x95, 0x16, 0x77, 0x59, 0x0e, 0x69, - 0x09, 0x78, 0x21, 0x0d, 0xc4, 0xdd, 0xf8, 0x68, 0x15, 0x4e, 0xd0, 0xde, 0x75, 0xb8, 0xf9, 0x29, - 0xd5, 0x4b, 0xc4, 0x94, 0x61, 0x79, 0xee, 0x61, 0x31, 0x43, 0xd8, 0x59, 0x47, 0x1a, 0x07, 0x67, - 0x3e, 0x89, 0xfe, 0xd0, 0x82, 0x87, 0x5d, 0xa6, 0x06, 0x4c, 0x87, 0xbd, 0xd6, 0x08, 0xe2, 0xa0, - 0x9d, 0xe4, 0x2a, 0x2b, 0x7a, 0xa9, 0x9f, 0xb9, 0xb7, 0x8a, 0x37, 0x78, 0x78, 0x71, 0x8f, 0x2e, - 0xe1, 0x3d, 0x3b, 0x8c, 0x7e, 0x00, 0x46, 0xe5, 0xba, 0x58, 0xa5, 0x22, 0x98, 0x29, 0xda, 0xca, - 0xdc, 0xc4, 0xad, 0xdd, 0xa9, 0xd1, 0x35, 0x13, 0x80, 0x93, 0x78, 0xf6, 0xbf, 0x29, 0x26, 0x4e, - 0x89, 0x94, 0x0f, 0x93, 0x89, 0x9b, 0x9a, 0xf4, 0xff, 0x48, 0xe9, 0x99, 0xab, 0xb8, 0x51, 0xde, - 0x25, 0x2d, 0x6e, 0x54, 0x53, 0x84, 0x0d, 0xe6, 0xd4, 0x28, 0x9d, 0x70, 0xd2, 0x9e, 0x52, 0x21, - 0x01, 0x5f, 0xce, 0xb3, 0x4b, 0xdd, 0x67, 0x7a, 0xa7, 0x44, 0xd7, 0x26, 0xba, 0x40, 0xb8, 0xbb, - 0x4b, 0xe8, 0x27, 0xa1, 0x12, 0xaa, 0xc8, 0x96, 0x62, 0x1e, 0x5b, 0x35, 0x39, 0x6d, 0x44, 0x77, - 0xd4, 0x01, 0x90, 0x8e, 0x61, 0xd1, 0x1c, 0xed, 0x3f, 0x48, 0x1e, 0x8c, 0x19, 0xb2, 0xa3, 0x8f, - 0x43, 0xbf, 0x4f, 0x5a, 0x30, 0x1c, 0x06, 0x9e, 0xe7, 0xfa, 0x0d, 0x2a, 0xe7, 0x84, 0xb2, 0x7e, - 0xf7, 0x91, 0xe8, 0x4b, 0x21, 0xd0, 0x98, 0x65, 0x8d, 0x35, 0x4f, 0x6c, 0x76, 0xc0, 0xfe, 0x86, - 0x05, 0x93, 0xbd, 0xe4, 0x31, 0x22, 0xf0, 0x90, 0x14, 0x36, 0x6a, 0x28, 0x56, 0xfc, 0x05, 0xe2, - 0x11, 0xe5, 0x36, 0x2f, 0xcf, 0x3d, 0x26, 0x5e, 0xf3, 0xa1, 0xd5, 0xde, 0xa8, 0x78, 0x2f, 0x3a, - 0xe8, 0x25, 0x38, 0x66, 0xbc, 0x57, 0xa4, 0x06, 0xa6, 0x32, 0x37, 0x4d, 0x0d, 0xa0, 0xd9, 0x14, - 0xec, 0xf6, 0xee, 0xd4, 0x03, 0xe9, 0x36, 0xa1, 0x30, 0xba, 0xe8, 0xd8, 0xbf, 0x5a, 0x48, 0x7f, - 0x2d, 0xa5, 0xeb, 0xdf, 0xb0, 0xba, 0xbc, 0x09, 0x3f, 0x76, 0x14, 0xfa, 0x95, 0xf9, 0x1d, 0x54, - 0x18, 0x46, 0x6f, 0x9c, 0x7b, 0x78, 0x6c, 0x6f, 0xff, 0xdb, 0x01, 0xd8, 0xa3, 0x67, 0x7d, 0x18, - 0xef, 0x07, 0x3e, 0x47, 0xfd, 0xb8, 0xa5, 0x0e, 0xcc, 0xf8, 0x1a, 0xae, 0x1f, 0xd5, 0xd8, 0xf3, - 0xfd, 0x53, 0xc4, 0x43, 0x47, 0x94, 0x17, 0x3d, 0x79, 0x34, 0x87, 0x3e, 0x6f, 0x25, 0x8f, 0xfc, - 0x78, 0x50, 0xa3, 0x7b, 0x64, 0x7d, 0x32, 0xce, 0x11, 0x79, 0xc7, 0xf4, 0xe9, 0x53, 0xaf, 0x13, - 0xc6, 0x69, 0x80, 0x0d, 0xd7, 0x77, 0x3c, 0xf7, 0x35, 0xba, 0x3b, 0x2a, 0x31, 0x05, 0xcf, 0x2c, - 0xa6, 0xf3, 0xaa, 0x15, 0x1b, 0x18, 0xa7, 0xff, 0x26, 0x0c, 0x1b, 0x6f, 0x9e, 0x11, 0xf1, 0x72, - 0xc2, 0x8c, 0x78, 0xa9, 0x18, 0x81, 0x2a, 0xa7, 0xdf, 0x09, 0xc7, 0xd2, 0x1d, 0x3c, 0xc8, 0xf3, - 0xf6, 0xff, 0x1e, 0x4a, 0x9f, 0xc1, 0xad, 0x91, 0xb0, 0x49, 0xbb, 0xf6, 0xa6, 0x63, 0xeb, 0x4d, - 0xc7, 0xd6, 0x9b, 0x8e, 0x2d, 0xf3, 0x6c, 0x42, 0x38, 0x6d, 0x86, 0xee, 0x92, 0xd3, 0x26, 0xe1, - 0x86, 0x2a, 0xe7, 0xee, 0x86, 0xb2, 0x3f, 0xd2, 0xe5, 0xb9, 0x5f, 0x0b, 0x09, 0x41, 0x01, 0x94, - 0xfc, 0xa0, 0x4e, 0xa4, 0x8d, 0x7b, 0x29, 0x1f, 0x83, 0xed, 0x4a, 0x50, 0x37, 0xc2, 0xc5, 0xe9, - 0xbf, 0x08, 0x73, 0x3e, 0xf6, 0x87, 0x07, 0x21, 0x61, 0x4e, 0xf2, 0xef, 0xfe, 0x7d, 0x30, 0x14, - 0x92, 0x56, 0x70, 0x15, 0x2f, 0x09, 0x5d, 0xa6, 0xb3, 0x6d, 0x78, 0x33, 0x96, 0x70, 0xaa, 0xf3, - 0x5a, 0x4e, 0xbc, 0x29, 0x94, 0x99, 0xd2, 0x79, 0xab, 0x4e, 0xbc, 0x89, 0x19, 0x04, 0xbd, 0x13, - 0xc6, 0xe2, 0xc4, 0x51, 0xb8, 0x38, 0xf2, 0x7d, 0x40, 0xe0, 0x8e, 0x25, 0x0f, 0xca, 0x71, 0x0a, - 0x1b, 0xbd, 0x0a, 0x03, 0x9b, 0xc4, 0x6b, 0x8a, 0x4f, 0x5f, 0xcd, 0x4f, 0xd7, 0xb0, 0x77, 0xbd, - 0x48, 0xbc, 0x26, 0x97, 0x84, 0xf4, 0x17, 0x66, 0xac, 0xe8, 0xbc, 0xaf, 0x6c, 0xb5, 0xa3, 0x38, - 0x68, 0xba, 0xaf, 0x49, 0x4f, 0xe7, 0x8f, 0xe5, 0xcc, 0xf8, 0xb2, 0xa4, 0xcf, 0x5d, 0x4a, 0xea, - 0x2f, 0xd6, 0x9c, 0x59, 0x3f, 0xea, 0x6e, 0xc8, 0xa6, 0x4c, 0x47, 0x38, 0x2c, 0xf3, 0xee, 0xc7, - 0x82, 0xa4, 0xcf, 0xfb, 0xa1, 0xfe, 0x62, 0xcd, 0x19, 0x75, 0xd4, 0xfa, 0x1b, 0x66, 0x7d, 0xb8, - 0x9a, 0x73, 0x1f, 0xf8, 0xda, 0xcb, 0x5c, 0x87, 0x8f, 0x41, 0xa9, 0xb6, 0xe9, 0x84, 0xf1, 0xe4, - 0x08, 0x9b, 0x34, 0x6a, 0x16, 0xcf, 0xd3, 0x46, 0xcc, 0x61, 0xe8, 0x11, 0x28, 0x86, 0x64, 0x83, - 0x45, 0x27, 0x1b, 0x71, 0x51, 0x98, 0x6c, 0x60, 0xda, 0xae, 0xec, 0xb2, 0xb1, 0x9e, 0x01, 0x73, - 0xbf, 0x5c, 0x48, 0x1a, 0x76, 0xc9, 0x91, 0xe1, 0xeb, 0xa1, 0xd6, 0x0e, 0x23, 0xe9, 0x20, 0x33, - 0xd6, 0x03, 0x6b, 0xc6, 0x12, 0x8e, 0x3e, 0x68, 0xc1, 0xd0, 0x8d, 0x28, 0xf0, 0x7d, 0x12, 0x0b, - 0x25, 0x7a, 0x2d, 0xe7, 0xc1, 0xba, 0xc4, 0xa9, 0xeb, 0x3e, 0x88, 0x06, 0x2c, 0xf9, 0xd2, 0xee, - 0x92, 0x9d, 0x9a, 0xd7, 0xae, 0x77, 0x05, 0xc3, 0x9c, 0xe3, 0xcd, 0x58, 0xc2, 0x29, 0xaa, 0xeb, - 0x73, 0xd4, 0x81, 0x24, 0xea, 0xa2, 0x2f, 0x50, 0x05, 0xdc, 0xfe, 0xf5, 0x32, 0x9c, 0xcc, 0x5c, - 0x3e, 0xd4, 0xe4, 0x62, 0x46, 0xcd, 0x79, 0xd7, 0x23, 0x32, 0x0c, 0x8c, 0x99, 0x5c, 0xd7, 0x54, - 0x2b, 0x36, 0x30, 0xd0, 0x4f, 0x01, 0xb4, 0x9c, 0xd0, 0x69, 0x12, 0xe5, 0xc0, 0x3e, 0xb4, 0x65, - 0x43, 0xfb, 0xb1, 0x2a, 0x69, 0xea, 0x4d, 0xbc, 0x6a, 0x8a, 0xb0, 0xc1, 0x12, 0x3d, 0x07, 0xc3, - 0x21, 0xf1, 0x88, 0x13, 0xb1, 0xf0, 0xf7, 0x74, 0x2e, 0x0f, 0xd6, 0x20, 0x6c, 0xe2, 0xa1, 0xc7, - 0x55, 0xc4, 0x5c, 0x2a, 0x72, 0x28, 0x19, 0x35, 0x87, 0x3e, 0x65, 0xc1, 0xd8, 0x86, 0xeb, 0x11, - 0xcd, 0x5d, 0x64, 0xde, 0xac, 0x1c, 0xfe, 0x25, 0xcf, 0x9b, 0x74, 0xb5, 0x0c, 0x4d, 0x34, 0x47, - 0x38, 0xc5, 0x9e, 0x7e, 0xe6, 0x6d, 0x12, 0x32, 0xe1, 0x3b, 0x98, 0xfc, 0xcc, 0xd7, 0x78, 0x33, - 0x96, 0x70, 0x34, 0x0b, 0xe3, 0x2d, 0x27, 0x8a, 0xe6, 0x43, 0x52, 0x27, 0x7e, 0xec, 0x3a, 0x1e, - 0xcf, 0x8b, 0x29, 0xeb, 0x70, 0xf2, 0xd5, 0x24, 0x18, 0xa7, 0xf1, 0xd1, 0xbb, 0xe0, 0x41, 0xee, - 0x21, 0x5a, 0x76, 0xa3, 0xc8, 0xf5, 0x1b, 0x7a, 0x1a, 0x08, 0x47, 0xd9, 0x94, 0x20, 0xf5, 0xe0, - 0x62, 0x36, 0x1a, 0xee, 0xf5, 0x3c, 0x7a, 0x12, 0xca, 0xd1, 0x96, 0xdb, 0x9a, 0x0f, 0xeb, 0x11, - 0x3b, 0x1d, 0x2a, 0x6b, 0xb7, 0x6c, 0x55, 0xb4, 0x63, 0x85, 0x81, 0x6a, 0x30, 0xc2, 0x3f, 0x09, - 0x0f, 0xf9, 0x13, 0x12, 0xf4, 0xa9, 0x9e, 0x8a, 0x5c, 0xa4, 0xc0, 0x4e, 0x63, 0xe7, 0xe6, 0x39, - 0x79, 0x56, 0xc5, 0x8f, 0x56, 0xae, 0x19, 0x64, 0x70, 0x82, 0x68, 0x72, 0x4f, 0x37, 0xdc, 0xc7, - 0x9e, 0xee, 0x39, 0x18, 0xde, 0x6a, 0xaf, 0x13, 0x31, 0xf2, 0x42, 0xb0, 0xa9, 0xd9, 0x77, 0x59, - 0x83, 0xb0, 0x89, 0xc7, 0xa2, 0x2d, 0x5b, 0xae, 0xf8, 0x17, 0x4d, 0x8e, 0x1a, 0xd1, 0x96, 0xab, - 0x8b, 0xb2, 0x19, 0x9b, 0x38, 0xb4, 0x6b, 0x74, 0x2c, 0xd6, 0x48, 0xc4, 0x92, 0x29, 0xe8, 0x70, - 0xa9, 0xae, 0x55, 0x25, 0x00, 0x6b, 0x1c, 0xb4, 0x0a, 0x27, 0xe8, 0x9f, 0x2a, 0x4b, 0x01, 0xbe, - 0xe6, 0x78, 0x6e, 0x9d, 0x87, 0xfe, 0x8d, 0x27, 0xfd, 0x9b, 0xd5, 0x0c, 0x1c, 0x9c, 0xf9, 0xa4, - 0xfd, 0x99, 0x42, 0xd2, 0x73, 0x62, 0x8a, 0x30, 0x14, 0x51, 0x41, 0x15, 0x5f, 0x73, 0x42, 0x69, - 0xf0, 0x1c, 0x32, 0xb9, 0x49, 0xd0, 0xbd, 0xe6, 0x84, 0xa6, 0xc8, 0x63, 0x0c, 0xb0, 0xe4, 0x84, - 0x6e, 0xc0, 0x40, 0xec, 0x39, 0x39, 0x65, 0x43, 0x1a, 0x1c, 0xb5, 0x23, 0x6b, 0x69, 0x36, 0xc2, - 0x8c, 0x07, 0x7a, 0x98, 0xee, 0xde, 0xd6, 0xe5, 0x49, 0x9b, 0xd8, 0x70, 0xad, 0x47, 0x98, 0xb5, - 0xda, 0xbf, 0x34, 0x9a, 0xa1, 0x75, 0x94, 0x21, 0x80, 0xce, 0x02, 0xd0, 0x49, 0xb3, 0x1a, 0x92, - 0x0d, 0x77, 0x47, 0x18, 0x62, 0x4a, 0xb2, 0x5d, 0x51, 0x10, 0x6c, 0x60, 0xc9, 0x67, 0xaa, 0xed, - 0x0d, 0xfa, 0x4c, 0xa1, 0xfb, 0x19, 0x0e, 0xc1, 0x06, 0x16, 0x7a, 0x16, 0x06, 0xdd, 0xa6, 0xd3, - 0x50, 0x81, 0xc0, 0x0f, 0x53, 0x91, 0xb6, 0xc8, 0x5a, 0x6e, 0xef, 0x4e, 0x8d, 0xa9, 0x0e, 0xb1, - 0x26, 0x2c, 0x70, 0xd1, 0xaf, 0x5a, 0x30, 0x52, 0x0b, 0x9a, 0xcd, 0xc0, 0xe7, 0xdb, 0x67, 0xe1, - 0x0b, 0xb8, 0x71, 0x54, 0x66, 0xd2, 0xf4, 0xbc, 0xc1, 0x8c, 0x3b, 0x03, 0x54, 0xda, 0xa6, 0x09, - 0xc2, 0x89, 0x5e, 0x99, 0x92, 0xaf, 0xb4, 0x8f, 0xe4, 0xfb, 0x0d, 0x0b, 0x26, 0xf8, 0xb3, 0xc6, - 0xae, 0x5e, 0x64, 0x28, 0x06, 0x47, 0xfc, 0x5a, 0x5d, 0x8e, 0x0e, 0xe5, 0xec, 0xed, 0x82, 0xe3, - 0xee, 0x4e, 0xa2, 0x0b, 0x30, 0xb1, 0x11, 0x84, 0x35, 0x62, 0x0e, 0x84, 0x10, 0xdb, 0x8a, 0xd0, - 0xf9, 0x34, 0x02, 0xee, 0x7e, 0x06, 0x5d, 0x83, 0x07, 0x8c, 0x46, 0x73, 0x1c, 0xb8, 0xe4, 0x7e, - 0x54, 0x50, 0x7b, 0xe0, 0x7c, 0x26, 0x16, 0xee, 0xf1, 0x74, 0x52, 0x48, 0x56, 0xfa, 0x10, 0x92, - 0xaf, 0xc0, 0xa9, 0x5a, 0xf7, 0xc8, 0x6c, 0x47, 0xed, 0xf5, 0x88, 0xcb, 0xf1, 0xf2, 0xdc, 0xf7, - 0x08, 0x02, 0xa7, 0xe6, 0x7b, 0x21, 0xe2, 0xde, 0x34, 0xd0, 0xfb, 0xa0, 0x1c, 0x12, 0xf6, 0x55, - 0x22, 0x91, 0xae, 0x77, 0x48, 0x6f, 0x87, 0xb6, 0xe0, 0x39, 0x59, 0xad, 0x99, 0x44, 0x43, 0x84, - 0x15, 0x47, 0x74, 0x13, 0x86, 0x5a, 0x4e, 0x5c, 0xdb, 0x14, 0x49, 0x7a, 0x87, 0xf6, 0xcd, 0x2b, - 0xe6, 0xec, 0x28, 0xc5, 0x28, 0x79, 0xc0, 0x99, 0x60, 0xc9, 0x8d, 0xda, 0x6a, 0xb5, 0xa0, 0xd9, - 0x0a, 0x7c, 0xe2, 0xc7, 0x52, 0x89, 0x8c, 0xf1, 0xf3, 0x0e, 0xd9, 0x8a, 0x0d, 0x8c, 0x2e, 0x5d, - 0xae, 0xd1, 0x26, 0x27, 0xf6, 0xd0, 0xe5, 0x06, 0xb5, 0x5e, 0xcf, 0x53, 0x65, 0xc3, 0xdc, 0x8a, - 0xd7, 0xdd, 0x78, 0x33, 0x68, 0xc7, 0x72, 0x97, 0x2c, 0x14, 0x95, 0x52, 0x36, 0x4b, 0x19, 0x38, - 0x38, 0xf3, 0xc9, 0xb4, 0x66, 0x1d, 0xbf, 0x33, 0xcd, 0x7a, 0xac, 0x0f, 0xcd, 0x5a, 0x85, 0x93, - 0xac, 0x07, 0xc2, 0x4a, 0x96, 0x4e, 0xcb, 0x68, 0x12, 0xb1, 0xce, 0xab, 0xfc, 0x96, 0xa5, 0x2c, - 0x24, 0x9c, 0xfd, 0xec, 0xe9, 0x1f, 0x81, 0x89, 0x2e, 0x21, 0x77, 0x20, 0x87, 0xe4, 0x02, 0x3c, - 0x90, 0x2d, 0x4e, 0x0e, 0xe4, 0x96, 0xfc, 0xf5, 0x54, 0x5c, 0xba, 0xb1, 0x45, 0xeb, 0xc3, 0xc5, - 0xed, 0x40, 0x91, 0xf8, 0xdb, 0x42, 0xbb, 0x9e, 0x3f, 0xdc, 0xac, 0x3e, 0xe7, 0x6f, 0x73, 0x69, - 0xc8, 0xfc, 0x78, 0xe7, 0xfc, 0x6d, 0x4c, 0x69, 0xa3, 0x5f, 0xb0, 0x12, 0x1b, 0x08, 0xee, 0x18, - 0x7f, 0xcf, 0x91, 0xec, 0x49, 0xfb, 0xde, 0x53, 0xd8, 0xff, 0xae, 0x00, 0x67, 0xf6, 0x23, 0xd2, - 0xc7, 0xf0, 0x3d, 0x06, 0x83, 0x11, 0x8b, 0x34, 0x11, 0xea, 0x6a, 0x98, 0xae, 0x62, 0x1e, 0x7b, - 0xf2, 0x0a, 0x16, 0x20, 0xe4, 0x41, 0xb1, 0xe9, 0xb4, 0x84, 0xbf, 0x74, 0xf1, 0xb0, 0xf9, 0x7b, - 0xf4, 0xbf, 0xe3, 0x2d, 0x3b, 0x2d, 0x3e, 0xe7, 0x8d, 0x06, 0x4c, 0xd9, 0xa0, 0x18, 0x4a, 0x4e, - 0x18, 0x3a, 0x32, 0xac, 0xe1, 0x72, 0x3e, 0xfc, 0x66, 0x29, 0x49, 0x7e, 0x2a, 0x9c, 0x68, 0xc2, - 0x9c, 0x99, 0xfd, 0xe9, 0x72, 0x22, 0xd9, 0x8b, 0xc5, 0xaa, 0x44, 0x30, 0x28, 0xdc, 0xa4, 0x56, - 0xde, 0x69, 0x93, 0x3c, 0x9b, 0x9a, 0x79, 0x20, 0x44, 0x4d, 0x0a, 0xc1, 0x0a, 0x7d, 0xcc, 0x62, - 0x95, 0x1f, 0x64, 0x06, 0x9d, 0xd8, 0xd5, 0x1f, 0x4d, 0x21, 0x0a, 0xb3, 0x9e, 0x84, 0x6c, 0xc4, - 0x26, 0x77, 0x51, 0xdd, 0x86, 0xed, 0x66, 0xba, 0xab, 0xdb, 0xb0, 0xdd, 0x89, 0x84, 0xa3, 0x9d, - 0x8c, 0x98, 0x94, 0x1c, 0xaa, 0x07, 0xf4, 0x11, 0x85, 0xf2, 0x79, 0x0b, 0x26, 0xdc, 0x74, 0x70, - 0x81, 0xd8, 0x03, 0x5f, 0xcf, 0xc7, 0xa7, 0xd9, 0x1d, 0xbb, 0xa0, 0x0c, 0x9d, 0x2e, 0x10, 0xee, - 0xee, 0x0c, 0xaa, 0xc3, 0x80, 0xeb, 0x6f, 0x04, 0xc2, 0xbc, 0x9b, 0x3b, 0x5c, 0xa7, 0x16, 0xfd, - 0x8d, 0x40, 0xaf, 0x66, 0xfa, 0x0f, 0x33, 0xea, 0x68, 0x09, 0x4e, 0xc8, 0x7c, 0x9f, 0x8b, 0x6e, - 0x14, 0x07, 0x61, 0x67, 0xc9, 0x6d, 0xba, 0x31, 0x33, 0xcd, 0x8a, 0x73, 0x93, 0x54, 0xbd, 0xe1, - 0x0c, 0x38, 0xce, 0x7c, 0x0a, 0xbd, 0x06, 0x43, 0xf2, 0x40, 0xbf, 0x9c, 0x87, 0x3f, 0xa1, 0x7b, - 0xfe, 0xab, 0xc9, 0x54, 0x15, 0x27, 0xfa, 0x92, 0x21, 0xfa, 0xa8, 0x05, 0x63, 0xfc, 0xf7, 0xc5, - 0x4e, 0x9d, 0xa7, 0x18, 0x56, 0xf2, 0x88, 0xda, 0xaf, 0x26, 0x68, 0xce, 0xa1, 0x5b, 0xbb, 0x53, - 0x63, 0xc9, 0x36, 0x9c, 0xe2, 0x6b, 0xff, 0xe3, 0x11, 0xe8, 0x0e, 0x81, 0x48, 0xc6, 0x3b, 0x58, - 0x77, 0x3b, 0xde, 0x81, 0xee, 0x2a, 0x23, 0x1d, 0xaa, 0x90, 0xc3, 0x32, 0x13, 0x5c, 0xf5, 0x31, - 0x74, 0xc7, 0xaf, 0x61, 0xc6, 0x03, 0xb5, 0x61, 0x90, 0x17, 0x97, 0x12, 0x1a, 0xe0, 0xf0, 0x27, - 0xdf, 0x66, 0x91, 0x2a, 0xed, 0xd6, 0xe2, 0xad, 0x58, 0x30, 0x43, 0x3b, 0x30, 0xb4, 0xc9, 0xa7, - 0xa3, 0xd8, 0xeb, 0x2d, 0x1f, 0x76, 0x7c, 0x13, 0x73, 0x5c, 0x4f, 0x3e, 0xd1, 0x80, 0x25, 0x3b, - 0x16, 0x5e, 0x67, 0x04, 0x00, 0x71, 0x41, 0x92, 0x5f, 0xb6, 0x64, 0xff, 0xd1, 0x3f, 0xef, 0x85, - 0x91, 0x90, 0xd4, 0x02, 0xbf, 0xe6, 0x7a, 0xa4, 0x3e, 0x2b, 0x0f, 0xc4, 0x0e, 0x92, 0x24, 0xc7, - 0xbc, 0x49, 0xd8, 0xa0, 0x81, 0x13, 0x14, 0xd9, 0x3a, 0x53, 0x89, 0xf3, 0xf4, 0x83, 0x10, 0x71, - 0xf0, 0xb1, 0x94, 0x53, 0x9a, 0x3e, 0xa3, 0xc9, 0xd7, 0x59, 0xb2, 0x0d, 0xa7, 0xf8, 0xa2, 0x97, - 0x00, 0x82, 0x75, 0x1e, 0x43, 0x37, 0x1b, 0x8b, 0x53, 0x90, 0x83, 0xbc, 0xea, 0x18, 0x4f, 0xb6, - 0x95, 0x14, 0xb0, 0x41, 0x0d, 0x5d, 0x06, 0xe0, 0x2b, 0x67, 0xad, 0xd3, 0x92, 0x1b, 0x42, 0x99, - 0xe5, 0x08, 0x55, 0x05, 0xb9, 0xbd, 0x3b, 0xd5, 0xed, 0x73, 0x66, 0x81, 0x42, 0xc6, 0xe3, 0xe8, - 0x27, 0x60, 0x28, 0x6a, 0x37, 0x9b, 0x8e, 0x3a, 0x23, 0xc9, 0x31, 0x7d, 0x97, 0xd3, 0x35, 0x04, - 0x23, 0x6f, 0xc0, 0x92, 0x23, 0xba, 0x41, 0x45, 0xbc, 0x90, 0x50, 0x7c, 0x15, 0x71, 0x0b, 0x85, - 0x7b, 0x02, 0xdf, 0x21, 0x77, 0x31, 0x38, 0x03, 0xe7, 0xf6, 0xee, 0xd4, 0x03, 0xc9, 0xf6, 0xa5, - 0x40, 0x24, 0xd4, 0x66, 0xd2, 0x44, 0x97, 0x64, 0x1d, 0x2d, 0xfa, 0xda, 0xb2, 0xbc, 0xcb, 0x13, - 0xba, 0x8e, 0x16, 0x6b, 0xee, 0x3d, 0x66, 0xe6, 0xc3, 0x68, 0x19, 0x8e, 0xd7, 0x02, 0x3f, 0x0e, - 0x03, 0xcf, 0xe3, 0x35, 0xf6, 0xf8, 0xde, 0x9c, 0x9f, 0xa1, 0x3c, 0x24, 0xba, 0x7d, 0x7c, 0xbe, - 0x1b, 0x05, 0x67, 0x3d, 0x47, 0x6d, 0xf2, 0xb4, 0x7e, 0x18, 0xcb, 0xe5, 0x78, 0x3d, 0x41, 0x53, - 0x48, 0x28, 0xe5, 0xf6, 0xde, 0x47, 0x53, 0xf8, 0xc9, 0x43, 0x56, 0xf1, 0xc5, 0x9e, 0x85, 0x11, - 0xb2, 0x13, 0x93, 0xd0, 0x77, 0xbc, 0xab, 0x78, 0x49, 0x1e, 0x58, 0xb0, 0x85, 0x79, 0xce, 0x68, - 0xc7, 0x09, 0x2c, 0x64, 0x2b, 0x2f, 0x99, 0x91, 0xb9, 0xce, 0xbd, 0x64, 0xd2, 0x27, 0x66, 0x7f, - 0xb1, 0x98, 0xb0, 0x59, 0xef, 0xc9, 0x91, 0x2e, 0x2b, 0x91, 0x24, 0x6b, 0x49, 0x31, 0x80, 0xd8, - 0x8b, 0xe5, 0xc9, 0x59, 0x95, 0x48, 0x5a, 0x31, 0x19, 0xe1, 0x24, 0x5f, 0xb4, 0x05, 0xa5, 0xcd, - 0x20, 0x8a, 0xe5, 0x0e, 0xed, 0x90, 0x9b, 0xc1, 0x8b, 0x41, 0x14, 0x33, 0x43, 0x4b, 0xbd, 0x36, - 0x6d, 0x89, 0x30, 0xe7, 0x41, 0xf7, 0xfe, 0xd1, 0xa6, 0x13, 0xd6, 0xa3, 0x79, 0x56, 0x67, 0x62, - 0x80, 0x59, 0x58, 0xca, 0x9e, 0xae, 0x6a, 0x10, 0x36, 0xf1, 0xec, 0x6f, 0x5b, 0x89, 0x53, 0xad, - 0xeb, 0x2c, 0x69, 0x60, 0x9b, 0xf8, 0x54, 0x44, 0x99, 0x61, 0x8a, 0x3f, 0x90, 0x4a, 0xc1, 0x7e, - 0x5b, 0xaf, 0x72, 0x98, 0x37, 0x29, 0x85, 0x69, 0x46, 0xc2, 0x88, 0x68, 0xfc, 0x80, 0x95, 0xcc, - 0xa5, 0x2f, 0xe4, 0xb1, 0x75, 0x33, 0xeb, 0x49, 0xec, 0x9b, 0x96, 0x6f, 0xff, 0x82, 0x05, 0x43, - 0x73, 0x4e, 0x6d, 0x2b, 0xd8, 0xd8, 0x40, 0x4f, 0x42, 0xb9, 0xde, 0x0e, 0xcd, 0xb4, 0x7e, 0xe5, - 0xac, 0x5a, 0x10, 0xed, 0x58, 0x61, 0xd0, 0xa9, 0xbf, 0xe1, 0xd4, 0x64, 0x55, 0x89, 0x22, 0x9f, - 0xfa, 0xe7, 0x59, 0x0b, 0x16, 0x10, 0x3a, 0xfc, 0x4d, 0x67, 0x47, 0x3e, 0x9c, 0x3e, 0x52, 0x5b, - 0xd6, 0x20, 0x6c, 0xe2, 0xd9, 0xff, 0xda, 0x82, 0xc9, 0x39, 0x27, 0x72, 0x6b, 0xb3, 0xed, 0x78, - 0x73, 0xce, 0x8d, 0xd7, 0xdb, 0xb5, 0x2d, 0x12, 0xf3, 0xea, 0x23, 0xb4, 0x97, 0xed, 0x88, 0xae, - 0x40, 0xb5, 0x63, 0x56, 0xbd, 0xbc, 0x2a, 0xda, 0xb1, 0xc2, 0x40, 0xaf, 0xc1, 0x70, 0xcb, 0x89, - 0xa2, 0x9b, 0x41, 0x58, 0xc7, 0x64, 0x23, 0x9f, 0xfa, 0x44, 0x55, 0x52, 0x0b, 0x49, 0x8c, 0xc9, - 0x86, 0x08, 0x50, 0xd1, 0xf4, 0xb1, 0xc9, 0xcc, 0xfe, 0x39, 0x0b, 0x4e, 0xcc, 0x11, 0x27, 0x24, - 0x21, 0x2b, 0x67, 0xa4, 0x5e, 0x04, 0xbd, 0x0a, 0xe5, 0x98, 0xb6, 0xd0, 0x1e, 0x59, 0xf9, 0xf6, - 0x88, 0x85, 0x96, 0xac, 0x09, 0xe2, 0x58, 0xb1, 0xb1, 0x3f, 0x69, 0xc1, 0xa9, 0xac, 0xbe, 0xcc, - 0x7b, 0x41, 0xbb, 0x7e, 0x2f, 0x3a, 0xf4, 0x77, 0x2c, 0x18, 0x61, 0xc7, 0xf5, 0x0b, 0x24, 0x76, - 0x5c, 0xaf, 0xab, 0x94, 0xa2, 0xd5, 0x67, 0x29, 0xc5, 0x33, 0x30, 0xb0, 0x19, 0x34, 0x49, 0x3a, - 0xd4, 0xe4, 0x62, 0xd0, 0x24, 0x98, 0x41, 0xd0, 0xd3, 0x74, 0x12, 0xba, 0x7e, 0xec, 0xd0, 0xe5, - 0x28, 0x8f, 0x33, 0xc6, 0xf9, 0x04, 0x54, 0xcd, 0xd8, 0xc4, 0xb1, 0x7f, 0xa7, 0x02, 0x43, 0x22, - 0x2e, 0xaa, 0xef, 0x6a, 0x38, 0xd2, 0x8b, 0x53, 0xe8, 0xe9, 0xc5, 0x89, 0x60, 0xb0, 0xc6, 0xea, - 0xdd, 0x0a, 0x0b, 0xfd, 0x72, 0x2e, 0x81, 0x74, 0xbc, 0x84, 0xae, 0xee, 0x16, 0xff, 0x8f, 0x05, - 0x2b, 0xf4, 0xba, 0x05, 0xe3, 0xb5, 0xc0, 0xf7, 0x49, 0x4d, 0xdb, 0x8e, 0x03, 0x79, 0x6c, 0x10, - 0xe6, 0x93, 0x44, 0xf5, 0x49, 0x70, 0x0a, 0x80, 0xd3, 0xec, 0xd1, 0x0b, 0x30, 0xca, 0xc7, 0xec, - 0x5a, 0xe2, 0x0c, 0x46, 0x57, 0xd8, 0x33, 0x81, 0x38, 0x89, 0x8b, 0xa6, 0xf9, 0x59, 0x96, 0xa8, - 0x65, 0x37, 0xa8, 0x5d, 0xd5, 0x46, 0x15, 0x3b, 0x03, 0x03, 0x85, 0x80, 0x42, 0xb2, 0x11, 0x92, - 0x68, 0x53, 0xc4, 0x8d, 0x31, 0xbb, 0x75, 0xe8, 0xce, 0xea, 0x58, 0xe0, 0x2e, 0x4a, 0x38, 0x83, - 0x3a, 0xda, 0x12, 0x6e, 0x84, 0x72, 0x1e, 0xf2, 0x5c, 0x7c, 0xe6, 0x9e, 0xde, 0x84, 0x29, 0x28, - 0x31, 0xd5, 0xc5, 0xec, 0xe5, 0x22, 0xcf, 0x9d, 0x64, 0x8a, 0x0d, 0xf3, 0x76, 0xb4, 0x00, 0xc7, - 0x52, 0xf5, 0x01, 0x23, 0x71, 0x56, 0xa2, 0xf2, 0xe4, 0x52, 0x95, 0x05, 0x23, 0xdc, 0xf5, 0x84, - 0xe9, 0x62, 0x1a, 0xde, 0xc7, 0xc5, 0xd4, 0x51, 0xd1, 0xc9, 0xfc, 0x14, 0xe3, 0xc5, 0x5c, 0x06, - 0xa0, 0xaf, 0x50, 0xe4, 0x4f, 0xa4, 0x42, 0x91, 0x47, 0x59, 0x07, 0xae, 0xe5, 0xd3, 0x81, 0x83, - 0xc7, 0x1d, 0xdf, 0xcb, 0x38, 0xe2, 0xff, 0x65, 0x81, 0xfc, 0xae, 0xf3, 0x4e, 0x6d, 0x93, 0xd0, - 0x29, 0x83, 0xde, 0x09, 0x63, 0xca, 0x3b, 0xc1, 0x4d, 0x22, 0x8b, 0xcd, 0x1a, 0x65, 0x3b, 0xe3, - 0x04, 0x14, 0xa7, 0xb0, 0xd1, 0x0c, 0x54, 0xe8, 0x38, 0xf1, 0x47, 0xb9, 0xde, 0x57, 0x1e, 0x90, - 0xd9, 0xd5, 0x45, 0xf1, 0x94, 0xc6, 0x41, 0x01, 0x4c, 0x78, 0x4e, 0x14, 0xb3, 0x1e, 0x54, 0x3b, - 0x7e, 0xed, 0x0e, 0xab, 0xc8, 0xb0, 0x64, 0xac, 0xa5, 0x34, 0x21, 0xdc, 0x4d, 0xdb, 0xfe, 0xf7, - 0x25, 0x18, 0x4d, 0x48, 0xc6, 0x03, 0x1a, 0x0c, 0x4f, 0x42, 0x59, 0xea, 0xf0, 0x74, 0xb9, 0x2c, - 0xa5, 0xe8, 0x15, 0x06, 0x55, 0x5a, 0xeb, 0x5a, 0xab, 0xa6, 0x0d, 0x1c, 0x43, 0xe1, 0x62, 0x13, - 0x8f, 0x09, 0xe5, 0xd8, 0x8b, 0xe6, 0x3d, 0x97, 0xf8, 0x31, 0xef, 0x66, 0x3e, 0x42, 0x79, 0x6d, - 0xa9, 0x6a, 0x12, 0xd5, 0x42, 0x39, 0x05, 0xc0, 0x69, 0xf6, 0xe8, 0xc3, 0x16, 0x8c, 0x3a, 0x37, - 0x23, 0x5d, 0x94, 0x5d, 0x04, 0x1d, 0x1f, 0x52, 0x49, 0x25, 0xea, 0xbc, 0x73, 0xc7, 0x7e, 0xa2, - 0x09, 0x27, 0x99, 0xa2, 0x37, 0x2c, 0x40, 0x64, 0x87, 0xd4, 0x64, 0x58, 0xb4, 0xe8, 0xcb, 0x60, - 0x1e, 0x3b, 0xf8, 0x73, 0x5d, 0x74, 0xb9, 0x54, 0xef, 0x6e, 0xc7, 0x19, 0x7d, 0x40, 0x97, 0x00, - 0xd5, 0xdd, 0xc8, 0x59, 0xf7, 0xc8, 0x7c, 0xd0, 0x94, 0x09, 0xc4, 0xe2, 0x3c, 0xfd, 0xb4, 0x18, - 0x67, 0xb4, 0xd0, 0x85, 0x81, 0x33, 0x9e, 0x62, 0xb3, 0x2c, 0x0c, 0x76, 0x3a, 0x57, 0x43, 0x8f, - 0x69, 0x09, 0x73, 0x96, 0x89, 0x76, 0xac, 0x30, 0xec, 0x3f, 0x2f, 0xaa, 0xa5, 0xac, 0x73, 0x00, - 0x1c, 0x23, 0x16, 0xd9, 0xba, 0xf3, 0x58, 0x64, 0x1d, 0x29, 0xd5, 0x9d, 0x16, 0x9f, 0xc8, 0xa2, - 0x2d, 0xdc, 0xa3, 0x2c, 0xda, 0x9f, 0xb6, 0x12, 0x25, 0xe9, 0x86, 0xcf, 0xbe, 0x94, 0x6f, 0xfe, - 0xc1, 0x34, 0x8f, 0xe2, 0x4a, 0xe9, 0x95, 0x54, 0xf0, 0xde, 0x93, 0x50, 0xde, 0xf0, 0x1c, 0x56, - 0x48, 0x85, 0x2d, 0x54, 0x23, 0xc2, 0xec, 0xbc, 0x68, 0xc7, 0x0a, 0x83, 0x4a, 0x7d, 0x83, 0xe8, - 0x81, 0xa4, 0xf6, 0x7f, 0x2a, 0xc2, 0xb0, 0xa1, 0xf1, 0x33, 0xcd, 0x37, 0xeb, 0x3e, 0x33, 0xdf, - 0x0a, 0x07, 0x30, 0xdf, 0x7e, 0x0a, 0x2a, 0x35, 0xa9, 0x8d, 0xf2, 0x29, 0xb1, 0x9f, 0xd6, 0x71, - 0x5a, 0x21, 0xa9, 0x26, 0xac, 0x79, 0xa2, 0x0b, 0x89, 0x4c, 0xcd, 0x84, 0x5f, 0x20, 0x2b, 0x95, - 0x52, 0x68, 0xb4, 0xee, 0x67, 0xd2, 0xf1, 0x01, 0xa5, 0xfd, 0xe3, 0x03, 0xec, 0xaf, 0x5b, 0xea, - 0xe3, 0xde, 0x85, 0x92, 0x3c, 0x37, 0x92, 0x25, 0x79, 0xce, 0xe5, 0x32, 0xcc, 0x3d, 0x6a, 0xf1, - 0x5c, 0x81, 0xa1, 0xf9, 0xa0, 0xd9, 0x74, 0xfc, 0x3a, 0xfa, 0x5e, 0x18, 0xaa, 0xf1, 0x9f, 0xc2, - 0x87, 0xc6, 0x0e, 0xab, 0x05, 0x14, 0x4b, 0x18, 0x7a, 0x18, 0x06, 0x9c, 0xb0, 0x21, 0xfd, 0x66, - 0x2c, 0x08, 0x6e, 0x36, 0x6c, 0x44, 0x98, 0xb5, 0xda, 0x7f, 0x69, 0xc1, 0x18, 0x7d, 0xc4, 0x65, - 0x2f, 0xc5, 0x5e, 0xe7, 0x71, 0x18, 0x74, 0xda, 0xf1, 0x66, 0xd0, 0xb5, 0x0f, 0x9b, 0x65, 0xad, - 0x58, 0x40, 0xe9, 0x3e, 0x4c, 0xd5, 0x72, 0x30, 0xf6, 0x61, 0x0b, 0x74, 0x2e, 0x33, 0x08, 0x35, - 0x65, 0xa3, 0xf6, 0x7a, 0xd6, 0x69, 0x69, 0x95, 0x37, 0x63, 0x09, 0xa7, 0xc4, 0xd6, 0x83, 0x7a, - 0x47, 0x84, 0xf6, 0x2a, 0x62, 0x73, 0x41, 0xbd, 0x83, 0x19, 0x04, 0x3d, 0x02, 0xc5, 0x68, 0xd3, - 0x91, 0xe7, 0xf2, 0x32, 0xca, 0xbc, 0x7a, 0x71, 0x16, 0xd3, 0x76, 0x95, 0x34, 0x11, 0x7a, 0xe9, - 0x18, 0xdb, 0x64, 0xd2, 0x44, 0xe8, 0xd9, 0xff, 0x62, 0x00, 0x58, 0xbc, 0x8d, 0x13, 0x92, 0xfa, - 0x5a, 0xc0, 0xaa, 0x01, 0x1f, 0xe9, 0xb1, 0xb6, 0xde, 0xc8, 0xde, 0xcf, 0x47, 0xdb, 0xc6, 0xf1, - 0x66, 0xf1, 0x6e, 0x1f, 0x6f, 0x66, 0x9f, 0x58, 0x0f, 0xdc, 0x47, 0x27, 0xd6, 0xf6, 0xc7, 0x2d, - 0x40, 0x2a, 0x7a, 0x4a, 0x87, 0x94, 0xcc, 0x40, 0x45, 0x85, 0x6b, 0x89, 0xf5, 0xa2, 0xc5, 0xa2, - 0x04, 0x60, 0x8d, 0xd3, 0x87, 0xf7, 0xe2, 0x31, 0xa9, 0xb3, 0x8a, 0xc9, 0x9c, 0x0b, 0xa6, 0xe9, - 0x84, 0x0a, 0xb3, 0x7f, 0xb7, 0x00, 0x0f, 0x70, 0x73, 0x69, 0xd9, 0xf1, 0x9d, 0x06, 0x69, 0xd2, - 0x5e, 0xf5, 0x1b, 0x24, 0x54, 0xa3, 0xdb, 0x66, 0x57, 0x66, 0x48, 0x1c, 0x56, 0x5e, 0x71, 0x39, - 0xc3, 0x25, 0xcb, 0xa2, 0xef, 0xc6, 0x98, 0x11, 0x47, 0x11, 0x94, 0xe5, 0x7d, 0x44, 0x42, 0xff, - 0xe4, 0xc4, 0x48, 0x89, 0x62, 0x61, 0x59, 0x10, 0xac, 0x18, 0x51, 0xf3, 0xc1, 0x0b, 0x6a, 0x5b, - 0x74, 0xc9, 0xa7, 0xcd, 0x87, 0x25, 0xd1, 0x8e, 0x15, 0x86, 0xdd, 0x84, 0x71, 0x39, 0x86, 0xad, - 0xcb, 0xa4, 0x83, 0xc9, 0x06, 0xd5, 0xb9, 0x35, 0xd9, 0x64, 0x5c, 0x91, 0xa4, 0x74, 0xee, 0xbc, - 0x09, 0xc4, 0x49, 0x5c, 0x59, 0x20, 0xb8, 0x90, 0x5d, 0x20, 0xd8, 0xfe, 0x5d, 0x0b, 0xd2, 0x4a, - 0xdf, 0x28, 0x87, 0x6a, 0xed, 0x59, 0x0e, 0xf5, 0x00, 0x05, 0x45, 0x7f, 0x1c, 0x86, 0x9d, 0x98, - 0x5a, 0x75, 0xdc, 0x03, 0x53, 0xbc, 0xb3, 0x93, 0xc3, 0xe5, 0xa0, 0xee, 0x6e, 0xb8, 0xcc, 0xf3, - 0x62, 0x92, 0xb3, 0xdf, 0xb0, 0xa0, 0xb2, 0x10, 0x76, 0x0e, 0x9e, 0xaa, 0xd6, 0x9d, 0x88, 0x56, - 0x38, 0x50, 0x22, 0x9a, 0x4c, 0x75, 0x2b, 0xf6, 0x4a, 0x75, 0xb3, 0xff, 0x6a, 0x00, 0x26, 0xba, - 0x72, 0x2f, 0xd1, 0xf3, 0x30, 0xa2, 0xbe, 0x92, 0x74, 0xbb, 0x56, 0xcc, 0xe0, 0x65, 0x0d, 0xc3, - 0x09, 0xcc, 0x3e, 0x96, 0xea, 0x22, 0x1c, 0x0f, 0xc9, 0xab, 0x6d, 0xd2, 0x26, 0xb3, 0x1b, 0x31, - 0x09, 0xab, 0xa4, 0x16, 0xf8, 0x75, 0x5e, 0x4f, 0xb8, 0x38, 0xf7, 0xe0, 0xad, 0xdd, 0xa9, 0xe3, - 0xb8, 0x1b, 0x8c, 0xb3, 0x9e, 0x41, 0x2d, 0x18, 0xf5, 0xcc, 0xfd, 0x82, 0xd8, 0xa6, 0xde, 0xd1, - 0x56, 0x43, 0xcd, 0xd6, 0x44, 0x33, 0x4e, 0x32, 0x48, 0x6e, 0x3a, 0x4a, 0xf7, 0x68, 0xd3, 0xf1, - 0x21, 0xbd, 0xe9, 0xe0, 0xb1, 0x40, 0xef, 0xce, 0x39, 0xf7, 0xb6, 0x9f, 0x5d, 0xc7, 0x61, 0xf6, - 0x11, 0x2f, 0x42, 0x59, 0xc6, 0x49, 0xf6, 0x15, 0x5f, 0x68, 0xd2, 0xe9, 0x21, 0xdb, 0x1f, 0x87, - 0xb7, 0x9e, 0x0b, 0x43, 0x63, 0x30, 0xaf, 0x04, 0xf1, 0xac, 0xe7, 0x05, 0x37, 0xa9, 0xb9, 0x72, - 0x35, 0x22, 0xc2, 0x0f, 0x68, 0xdf, 0x2e, 0x40, 0xc6, 0x96, 0x9a, 0xae, 0x49, 0x6d, 0x17, 0x26, - 0xd6, 0xe4, 0xc1, 0x6c, 0x43, 0xb4, 0xc3, 0x63, 0x49, 0xb9, 0x35, 0xf0, 0xae, 0xbc, 0x5d, 0x02, - 0x3a, 0xbc, 0x54, 0x49, 0x4a, 0x15, 0x62, 0x7a, 0x16, 0x40, 0x9b, 0xf3, 0xc2, 0x26, 0x54, 0xc1, - 0x21, 0xda, 0xea, 0xc7, 0x06, 0x16, 0x7a, 0x0e, 0x86, 0x5d, 0x3f, 0x8a, 0x1d, 0xcf, 0xbb, 0xe8, - 0xfa, 0xb1, 0xb0, 0x13, 0x95, 0xd9, 0xb3, 0xa8, 0x41, 0xd8, 0xc4, 0x3b, 0xfd, 0x0e, 0xe3, 0xfb, - 0x1d, 0xe4, 0xbb, 0x6f, 0xc2, 0xa9, 0x0b, 0x6e, 0xac, 0x92, 0x14, 0xd5, 0x7c, 0xa3, 0xd6, 0xba, - 0x92, 0x55, 0x56, 0xcf, 0xb4, 0x5c, 0x23, 0x49, 0xb0, 0x90, 0xcc, 0x69, 0x4c, 0x27, 0x09, 0xda, - 0x35, 0x38, 0x71, 0xc1, 0x8d, 0xcf, 0xbb, 0x1e, 0x39, 0x42, 0x26, 0x5f, 0x1a, 0x84, 0x11, 0x33, - 0x77, 0xff, 0x20, 0x92, 0xfd, 0x93, 0xd4, 0x8e, 0x15, 0x03, 0xe1, 0xaa, 0x03, 0xef, 0xeb, 0x87, - 0x2e, 0x24, 0x90, 0x3d, 0xb8, 0x86, 0x29, 0xab, 0x79, 0x62, 0xb3, 0x03, 0xe8, 0x26, 0x94, 0x36, - 0x58, 0xbe, 0x5b, 0x31, 0x8f, 0x50, 0xa5, 0xac, 0xc1, 0xd7, 0x2b, 0x97, 0x67, 0xcc, 0x71, 0x7e, - 0xd4, 0xfc, 0x08, 0x93, 0x69, 0xd6, 0x46, 0x16, 0x82, 0xd0, 0x6b, 0x0a, 0xa3, 0x97, 0xf6, 0x28, - 0xdd, 0x81, 0xf6, 0x48, 0xc8, 0xf2, 0xc1, 0x7b, 0x24, 0xcb, 0x59, 0xee, 0x62, 0xbc, 0xc9, 0x8c, - 0x63, 0x91, 0x36, 0x35, 0xc4, 0x06, 0xc1, 0xc8, 0x5d, 0x4c, 0x80, 0x71, 0x1a, 0x1f, 0xbd, 0x5f, - 0x69, 0x83, 0x72, 0x1e, 0x07, 0x0a, 0xe6, 0x8c, 0x3e, 0x6a, 0x45, 0xf0, 0xf1, 0x02, 0x8c, 0x5d, - 0xf0, 0xdb, 0xab, 0x17, 0x56, 0xdb, 0xeb, 0x9e, 0x5b, 0xbb, 0x4c, 0x3a, 0x54, 0xda, 0x6f, 0x91, - 0xce, 0xe2, 0x82, 0x58, 0x41, 0x6a, 0xce, 0x5c, 0xa6, 0x8d, 0x98, 0xc3, 0xa8, 0xdc, 0xda, 0x70, - 0xfd, 0x06, 0x09, 0x5b, 0xa1, 0x2b, 0x7c, 0xfd, 0x86, 0xdc, 0x3a, 0xaf, 0x41, 0xd8, 0xc4, 0xa3, - 0xb4, 0x83, 0x9b, 0x3e, 0x09, 0xd3, 0xbb, 0x84, 0x15, 0xda, 0x88, 0x39, 0x8c, 0x22, 0xc5, 0x61, - 0x5b, 0xb8, 0xd2, 0x0c, 0xa4, 0x35, 0xda, 0x88, 0x39, 0x4c, 0xec, 0xd2, 0x59, 0x24, 0x58, 0xa9, - 0x6b, 0x97, 0xce, 0x82, 0x28, 0x24, 0x9c, 0xa2, 0x6e, 0x91, 0xce, 0x82, 0x13, 0x3b, 0xe9, 0x4d, - 0xf6, 0x65, 0xde, 0x8c, 0x25, 0x9c, 0x15, 0x47, 0x4e, 0x0e, 0xc7, 0x77, 0x5c, 0x71, 0xe4, 0x64, - 0xf7, 0x7b, 0x38, 0x64, 0xfe, 0x76, 0x01, 0x46, 0xde, 0xbc, 0xc1, 0x34, 0xe3, 0x6e, 0x9e, 0xeb, - 0x30, 0xd1, 0x95, 0x31, 0xdd, 0x87, 0x85, 0xb4, 0x6f, 0x45, 0x0b, 0x1b, 0xc3, 0x30, 0x25, 0x2c, - 0x8b, 0x02, 0xce, 0xc3, 0x04, 0x5f, 0xbc, 0x94, 0x13, 0x4b, 0x80, 0x55, 0x59, 0xf0, 0xec, 0x30, - 0xeb, 0x5a, 0x1a, 0x88, 0xbb, 0xf1, 0xed, 0x4f, 0x58, 0x30, 0x9a, 0x48, 0x62, 0xcf, 0xc9, 0x96, - 0x63, 0xab, 0x3b, 0x60, 0x51, 0xcc, 0x2c, 0xab, 0xa4, 0xc8, 0xd4, 0xb0, 0x5e, 0xdd, 0x1a, 0x84, - 0x4d, 0x3c, 0xfb, 0xf7, 0x8b, 0x50, 0x96, 0x11, 0x57, 0x7d, 0x74, 0xe5, 0x63, 0x16, 0x8c, 0xaa, - 0x03, 0x44, 0xe6, 0xf1, 0x2d, 0xe4, 0x91, 0x53, 0x47, 0x7b, 0xa0, 0xfc, 0x27, 0xfe, 0x46, 0xa0, - 0x37, 0x16, 0xd8, 0x64, 0x86, 0x93, 0xbc, 0xd1, 0x35, 0x80, 0xa8, 0x13, 0xc5, 0xa4, 0x69, 0xf8, - 0x9e, 0x6d, 0x63, 0x96, 0x4d, 0xd7, 0x82, 0x90, 0xd0, 0x39, 0x75, 0x25, 0xa8, 0x93, 0xaa, 0xc2, - 0xd4, 0x16, 0x9e, 0x6e, 0xc3, 0x06, 0x25, 0xf4, 0x9a, 0x3a, 0xee, 0x1e, 0xc8, 0x43, 0xaf, 0xcb, - 0xf1, 0xed, 0xe7, 0xbc, 0xfb, 0x10, 0xe7, 0xcb, 0xf6, 0xaf, 0x15, 0xe0, 0x58, 0x7a, 0x24, 0xd1, - 0xbb, 0x61, 0x44, 0x0e, 0x9a, 0xe1, 0x66, 0x90, 0x61, 0x6e, 0x23, 0xd8, 0x80, 0xdd, 0xde, 0x9d, - 0x9a, 0xea, 0xbe, 0x0a, 0x7b, 0xda, 0x44, 0xc1, 0x09, 0x62, 0xfc, 0xf0, 0x59, 0x44, 0x49, 0xcc, - 0x75, 0x66, 0x5b, 0x2d, 0x71, 0x82, 0x6c, 0x1c, 0x3e, 0x9b, 0x50, 0x9c, 0xc2, 0x46, 0xab, 0x70, - 0xc2, 0x68, 0xb9, 0x42, 0xdc, 0xc6, 0xe6, 0x7a, 0x10, 0xca, 0x7d, 0xed, 0xc3, 0x3a, 0xa8, 0xb6, - 0x1b, 0x07, 0x67, 0x3e, 0x49, 0x0d, 0xa3, 0x9a, 0xd3, 0x72, 0x6a, 0x6e, 0xdc, 0x11, 0x67, 0x00, - 0x4a, 0x8c, 0xcf, 0x8b, 0x76, 0xac, 0x30, 0xec, 0x7f, 0x30, 0x00, 0xc7, 0x78, 0x14, 0x29, 0x51, - 0x41, 0xd2, 0xe8, 0xdd, 0x50, 0x89, 0x62, 0x27, 0xe4, 0x4e, 0x0d, 0xeb, 0xc0, 0xa2, 0x4b, 0x67, - 0xde, 0x4b, 0x22, 0x58, 0xd3, 0x43, 0x2f, 0xb1, 0xb2, 0x65, 0x6e, 0xb4, 0xc9, 0xa8, 0x17, 0xee, - 0xcc, 0x65, 0x72, 0x5e, 0x51, 0xc0, 0x06, 0x35, 0xf4, 0x43, 0x50, 0x6a, 0x6d, 0x3a, 0x91, 0xf4, - 0xe7, 0x3d, 0x2e, 0xe5, 0xc4, 0x2a, 0x6d, 0xbc, 0xbd, 0x3b, 0x75, 0x32, 0xfd, 0xaa, 0x0c, 0x80, - 0xf9, 0x43, 0xa6, 0x94, 0x1f, 0xd8, 0xff, 0x6a, 0x9d, 0x7a, 0xd8, 0xa9, 0x5e, 0x9c, 0x4d, 0x5f, - 0xc6, 0xb2, 0xc0, 0x5a, 0xb1, 0x80, 0x52, 0x99, 0xb4, 0xc9, 0x59, 0xd6, 0x29, 0xf2, 0x60, 0xd2, - 0xe2, 0xb8, 0xa8, 0x41, 0xd8, 0xc4, 0x43, 0x1f, 0xef, 0x8e, 0x31, 0x1e, 0x3a, 0x82, 0x1c, 0x94, - 0x7e, 0xa3, 0x8b, 0xcf, 0x41, 0x45, 0x74, 0x75, 0x2d, 0x40, 0xcf, 0xc3, 0x08, 0x77, 0x17, 0xcd, - 0x85, 0x8e, 0x5f, 0xdb, 0x4c, 0x3b, 0x79, 0xd6, 0x0c, 0x18, 0x4e, 0x60, 0xda, 0xcb, 0x30, 0xd0, - 0xa7, 0x90, 0xed, 0x6b, 0xef, 0xfe, 0x22, 0x94, 0x29, 0x39, 0xb9, 0x41, 0xcb, 0x83, 0x64, 0x00, - 0x65, 0x79, 0x51, 0x23, 0xb2, 0xa1, 0xe8, 0x3a, 0x32, 0x96, 0x44, 0x2d, 0xa1, 0xc5, 0x28, 0x6a, - 0xb3, 0x69, 0x47, 0x81, 0xe8, 0x31, 0x28, 0x92, 0x9d, 0x56, 0x3a, 0x68, 0xe4, 0xdc, 0x4e, 0xcb, - 0x0d, 0x49, 0x44, 0x91, 0xc8, 0x4e, 0x0b, 0x9d, 0x86, 0x82, 0x5b, 0x17, 0x33, 0x12, 0x04, 0x4e, - 0x61, 0x71, 0x01, 0x17, 0xdc, 0xba, 0xbd, 0x03, 0x15, 0x75, 0x33, 0x24, 0xda, 0x92, 0x26, 0x95, - 0x95, 0x47, 0x14, 0xb1, 0xa4, 0xdb, 0xc3, 0x98, 0x6a, 0x03, 0xe8, 0x92, 0x0e, 0x79, 0xa9, 0xe0, - 0x33, 0x30, 0x50, 0x0b, 0x44, 0x31, 0x9e, 0xb2, 0x26, 0xc3, 0x6c, 0x29, 0x06, 0xb1, 0xaf, 0xc3, - 0xd8, 0x65, 0x3f, 0xb8, 0xc9, 0x2e, 0x70, 0x62, 0xf5, 0x8a, 0x29, 0xe1, 0x0d, 0xfa, 0x23, 0x6d, - 0xb9, 0x33, 0x28, 0xe6, 0x30, 0x55, 0x49, 0xb5, 0xd0, 0xab, 0x92, 0xaa, 0xfd, 0x01, 0x0b, 0x46, - 0x54, 0x6e, 0xf8, 0x85, 0xed, 0x2d, 0x4a, 0xb7, 0x11, 0x06, 0xed, 0x56, 0x9a, 0x2e, 0xbb, 0x84, - 0x16, 0x73, 0x98, 0x59, 0x34, 0xa1, 0xb0, 0x4f, 0xd1, 0x84, 0x33, 0x30, 0xb0, 0xe5, 0xfa, 0xf5, - 0xb4, 0x53, 0xf4, 0xb2, 0xeb, 0xd7, 0x31, 0x83, 0xd8, 0xff, 0xca, 0x82, 0x63, 0xaa, 0x0b, 0xd2, - 0x66, 0x7a, 0x1e, 0x46, 0xd6, 0xdb, 0xae, 0x57, 0x97, 0x85, 0x98, 0x53, 0xcb, 0x65, 0xce, 0x80, - 0xe1, 0x04, 0x26, 0x3a, 0x0b, 0xb0, 0xee, 0xfa, 0x4e, 0xd8, 0x59, 0xd5, 0x46, 0x9a, 0xd2, 0xdb, - 0x73, 0x0a, 0x82, 0x0d, 0x2c, 0xca, 0x2d, 0x22, 0xb1, 0x4e, 0x72, 0xe0, 0x1f, 0x42, 0x71, 0xab, - 0x1a, 0x30, 0x9c, 0xc0, 0xb4, 0x3f, 0x55, 0x84, 0xb1, 0x64, 0x6e, 0x7d, 0x1f, 0x5e, 0x8f, 0xc7, - 0xa0, 0xc4, 0xd2, 0xed, 0xd3, 0x93, 0x82, 0x57, 0x3d, 0xe6, 0x30, 0x14, 0xc1, 0x20, 0x17, 0x03, - 0xf9, 0x5c, 0x01, 0xaa, 0x3a, 0xa9, 0x7c, 0xb0, 0x2c, 0x4a, 0x5b, 0xb8, 0xb4, 0x05, 0x2b, 0xf4, - 0x61, 0x0b, 0x86, 0x82, 0x96, 0x59, 0xbb, 0xf3, 0x5d, 0x79, 0xd6, 0x1d, 0x10, 0xc9, 0xbd, 0xc2, - 0x92, 0x51, 0x93, 0x46, 0x7e, 0x48, 0xc9, 0xfa, 0xf4, 0x0f, 0xc2, 0x88, 0x89, 0xb9, 0x9f, 0x31, - 0x53, 0x36, 0x8d, 0x99, 0x8f, 0x99, 0xd3, 0x49, 0x54, 0x56, 0xe8, 0x63, 0xa1, 0x5e, 0x85, 0x52, - 0x4d, 0x85, 0xb2, 0xdd, 0x51, 0xe1, 0x7f, 0x55, 0x79, 0x8c, 0x85, 0x09, 0x70, 0x6a, 0xf6, 0xd7, - 0x2d, 0x63, 0x7e, 0x60, 0x12, 0x2d, 0xd6, 0x51, 0x08, 0xc5, 0xc6, 0xf6, 0x96, 0x30, 0x10, 0x2e, - 0xe5, 0x34, 0xbc, 0x17, 0xb6, 0xb7, 0xf4, 0x7c, 0x35, 0x5b, 0x31, 0x65, 0xd6, 0xc7, 0x41, 0x41, - 0xa2, 0x00, 0x47, 0x71, 0xff, 0x02, 0x1c, 0xf6, 0x1b, 0x05, 0x98, 0xe8, 0x9a, 0x54, 0xe8, 0x35, - 0x28, 0x85, 0xf4, 0x2d, 0xc5, 0xeb, 0x2d, 0xe5, 0x56, 0x32, 0x23, 0x5a, 0xac, 0x6b, 0xc5, 0x9b, - 0x6c, 0xc7, 0x9c, 0x25, 0xba, 0x04, 0x48, 0x07, 0x5c, 0xaa, 0x53, 0x0a, 0xfe, 0xca, 0x2a, 0x2a, - 0x6b, 0xb6, 0x0b, 0x03, 0x67, 0x3c, 0x85, 0x5e, 0x48, 0x1f, 0x76, 0x14, 0x93, 0xa7, 0x6c, 0x7b, - 0x9d, 0x5b, 0xd8, 0xbf, 0x55, 0x80, 0xd1, 0x44, 0x29, 0x55, 0xe4, 0x41, 0x99, 0x78, 0xec, 0x08, - 0x54, 0xaa, 0xa9, 0xc3, 0x5e, 0x8c, 0xa2, 0x54, 0xeb, 0x39, 0x41, 0x17, 0x2b, 0x0e, 0xf7, 0x47, - 0xb0, 0xd6, 0xf3, 0x30, 0x22, 0x3b, 0xf4, 0x2e, 0xa7, 0xe9, 0x89, 0x01, 0x54, 0x73, 0xf4, 0x9c, - 0x01, 0xc3, 0x09, 0x4c, 0xfb, 0xf7, 0x8a, 0x30, 0xc9, 0xcf, 0x8c, 0xeb, 0x6a, 0xe6, 0xa9, 0xd8, - 0x8f, 0x9f, 0xd7, 0x05, 0x8f, 0xad, 0x3c, 0x6e, 0xff, 0xee, 0xc5, 0xa8, 0xaf, 0x18, 0xe3, 0xcf, - 0xa5, 0x62, 0x8c, 0xf9, 0x9e, 0xb6, 0x71, 0x44, 0x3d, 0xfa, 0xce, 0x0a, 0x3a, 0xfe, 0x27, 0x05, - 0x18, 0x4f, 0x5d, 0xf2, 0x86, 0x3e, 0x95, 0xbc, 0x17, 0xc4, 0xca, 0xe3, 0x3c, 0x6d, 0xcf, 0x7b, - 0xbf, 0x0e, 0x76, 0x3b, 0xc8, 0x3d, 0x5a, 0x2a, 0xf6, 0xd7, 0x0a, 0x30, 0x96, 0xbc, 0x9d, 0xee, - 0x3e, 0x1c, 0xa9, 0xb7, 0x43, 0x85, 0x5d, 0xc0, 0x74, 0x99, 0x74, 0xe4, 0x71, 0x1c, 0xbf, 0xeb, - 0x46, 0x36, 0x62, 0x0d, 0xbf, 0x2f, 0x2e, 0x5d, 0xb1, 0xff, 0x99, 0x05, 0x27, 0xf9, 0x5b, 0xa6, - 0xe7, 0xe1, 0xdf, 0xca, 0x1a, 0xdd, 0x97, 0xf3, 0xed, 0x60, 0xaa, 0x50, 0xf7, 0x7e, 0xe3, 0xcb, - 0xee, 0x40, 0x17, 0xbd, 0x4d, 0x4e, 0x85, 0xfb, 0xb0, 0xb3, 0x07, 0x9a, 0x0c, 0xf6, 0x7f, 0x28, - 0xc0, 0xf0, 0xca, 0xfc, 0xa2, 0x12, 0xe1, 0x33, 0x50, 0xa9, 0x85, 0xc4, 0xd1, 0x7e, 0x12, 0x33, - 0x22, 0x49, 0x02, 0xb0, 0xc6, 0xa1, 0xdb, 0x0d, 0x1e, 0xd1, 0x17, 0xa5, 0xb7, 0x1b, 0x3c, 0xe0, - 0x2f, 0xc2, 0x12, 0x8e, 0x9e, 0x84, 0x32, 0xcb, 0xb5, 0xbd, 0x1a, 0x4a, 0x8d, 0xa3, 0xf7, 0xa0, - 0xac, 0x1d, 0x2f, 0x61, 0x85, 0x41, 0x09, 0xd7, 0x83, 0x5a, 0x44, 0x91, 0x53, 0xae, 0x8b, 0x05, - 0xda, 0x8c, 0x97, 0xb0, 0x84, 0xb3, 0x52, 0x89, 0x6c, 0x7b, 0x4f, 0x91, 0x4b, 0xc9, 0x4e, 0x73, - 0x3f, 0x00, 0x45, 0xd7, 0x38, 0x07, 0x29, 0xa9, 0x99, 0xca, 0x77, 0x1b, 0xea, 0x2f, 0xdf, 0xcd, - 0xfe, 0x5a, 0x11, 0xf4, 0x75, 0xfa, 0xc8, 0x15, 0x05, 0x26, 0x72, 0x29, 0x04, 0x5f, 0xed, 0xf8, - 0x35, 0x7d, 0x71, 0x7f, 0x39, 0x55, 0x5f, 0xe2, 0x67, 0x2d, 0x18, 0x76, 0x7d, 0x37, 0x76, 0x1d, - 0xe6, 0x44, 0xcb, 0xe7, 0x4e, 0x6c, 0xc5, 0x6e, 0x91, 0x53, 0x0e, 0x42, 0xf3, 0x6c, 0x5c, 0x31, - 0xc3, 0x26, 0x67, 0xf4, 0x5e, 0x91, 0x5e, 0x55, 0xcc, 0xad, 0x4a, 0x4b, 0x39, 0x95, 0x53, 0xd5, - 0xa2, 0x06, 0x6d, 0x1c, 0xe6, 0x54, 0xdc, 0x08, 0x53, 0x52, 0xea, 0x4e, 0x11, 0xb5, 0x65, 0x60, - 0xcd, 0x98, 0x33, 0xb2, 0x23, 0x40, 0xdd, 0x63, 0x71, 0xc0, 0xd4, 0x95, 0x19, 0xa8, 0x38, 0xed, - 0x38, 0x68, 0xd2, 0x61, 0x12, 0x27, 0xeb, 0x3a, 0x39, 0x47, 0x02, 0xb0, 0xc6, 0xb1, 0x3f, 0x55, - 0x82, 0x54, 0xb9, 0x07, 0xb4, 0x03, 0x15, 0x55, 0xf0, 0x21, 0x9f, 0x54, 0x50, 0x3d, 0xa3, 0x54, - 0x67, 0x54, 0x13, 0xd6, 0xcc, 0x50, 0x43, 0xfa, 0x23, 0xf9, 0x6a, 0x7f, 0x31, 0xed, 0x8f, 0xfc, - 0xd1, 0xfe, 0x8e, 0xa7, 0xe8, 0x5c, 0x9d, 0xe1, 0x05, 0xfe, 0xa6, 0xf7, 0x75, 0x5d, 0xee, 0x77, - 0x2b, 0xf8, 0x07, 0xc5, 0x0d, 0x5e, 0x98, 0x44, 0x6d, 0x2f, 0x16, 0xb3, 0xe1, 0xc5, 0x1c, 0x57, - 0x19, 0x27, 0xac, 0xcb, 0x26, 0xf1, 0xff, 0xd8, 0x60, 0x9a, 0x74, 0x30, 0x0f, 0x1e, 0xa9, 0x83, - 0x79, 0x28, 0x57, 0x07, 0xf3, 0x59, 0x00, 0x36, 0xb7, 0x79, 0x88, 0x7d, 0x99, 0xf9, 0xfd, 0x94, - 0x8a, 0xc1, 0x0a, 0x82, 0x0d, 0x2c, 0xfb, 0xfb, 0x21, 0x59, 0xf7, 0x0b, 0x4d, 0xc9, 0x32, 0x63, - 0xfc, 0xe8, 0x8c, 0x65, 0x37, 0x26, 0x2a, 0x82, 0xfd, 0x86, 0x05, 0x66, 0x71, 0x32, 0xf4, 0x2a, - 0xaf, 0x82, 0x66, 0xe5, 0x71, 0x14, 0x63, 0xd0, 0x9d, 0x5e, 0x76, 0x5a, 0xa9, 0xb0, 0x20, 0x59, - 0x0a, 0xed, 0xf4, 0x3b, 0xa0, 0x2c, 0xa1, 0x07, 0x32, 0x96, 0xdf, 0x0f, 0xc7, 0x65, 0xa5, 0x04, - 0x79, 0x6a, 0x22, 0x8e, 0xe7, 0xf7, 0x77, 0xc6, 0x49, 0x0f, 0x5b, 0xa1, 0x97, 0x87, 0x4d, 0xed, - 0xfe, 0x8b, 0x3d, 0xeb, 0x9b, 0xff, 0xa6, 0x05, 0x67, 0xd2, 0x1d, 0x88, 0x96, 0x03, 0xdf, 0x8d, - 0x83, 0xb0, 0x4a, 0xe2, 0xd8, 0xf5, 0x1b, 0xac, 0x58, 0xed, 0x4d, 0x27, 0x94, 0x17, 0x16, 0x31, - 0x41, 0x79, 0xdd, 0x09, 0x7d, 0xcc, 0x5a, 0x51, 0x07, 0x06, 0x79, 0x4c, 0xb2, 0xd8, 0x05, 0x1d, - 0x72, 0x6d, 0x64, 0x0c, 0x87, 0xde, 0x86, 0xf1, 0x78, 0x68, 0x2c, 0x18, 0xda, 0xdf, 0xb4, 0x00, - 0xad, 0x6c, 0x93, 0x30, 0x74, 0xeb, 0x46, 0x14, 0x35, 0xbb, 0x09, 0xd3, 0xb8, 0xf1, 0xd2, 0xac, - 0xe3, 0x91, 0xba, 0x09, 0xd3, 0xf8, 0x97, 0x7d, 0x13, 0x66, 0xe1, 0x60, 0x37, 0x61, 0xa2, 0x15, - 0x38, 0xd9, 0xe4, 0xdb, 0x38, 0x7e, 0xbb, 0x1c, 0xdf, 0xd3, 0xa9, 0x94, 0xf3, 0x53, 0xb7, 0x76, - 0xa7, 0x4e, 0x2e, 0x67, 0x21, 0xe0, 0xec, 0xe7, 0xec, 0x77, 0x00, 0xe2, 0xc1, 0xd3, 0xf3, 0x59, - 0xf1, 0x9f, 0x3d, 0xdd, 0x5a, 0xf6, 0x67, 0x4b, 0x30, 0x9e, 0xba, 0xce, 0x82, 0x6e, 0xa1, 0xbb, - 0x03, 0x4e, 0x0f, 0xad, 0xbf, 0xbb, 0xbb, 0xd7, 0x57, 0x08, 0xab, 0x0f, 0x25, 0xd7, 0x6f, 0xb5, - 0xe3, 0x7c, 0x2a, 0x5e, 0xf0, 0x4e, 0x2c, 0x52, 0x82, 0x86, 0x03, 0x9f, 0xfe, 0xc5, 0x9c, 0x4d, - 0x9e, 0x01, 0xb1, 0x89, 0x4d, 0xce, 0xc0, 0x3d, 0x72, 0xb3, 0x7c, 0x50, 0x87, 0xa7, 0x96, 0xf2, - 0x70, 0xd8, 0xa6, 0x26, 0xcb, 0x51, 0xc7, 0x24, 0x7d, 0xb1, 0x00, 0xc3, 0xc6, 0x47, 0x43, 0xbf, - 0x9c, 0x2c, 0xdd, 0x69, 0xe5, 0xf7, 0x4a, 0x8c, 0xfe, 0xb4, 0x2e, 0xce, 0xc9, 0x5f, 0xe9, 0xf1, - 0xee, 0xaa, 0x9d, 0xb7, 0x77, 0xa7, 0x8e, 0xa5, 0xea, 0x72, 0x26, 0x2a, 0x79, 0x9e, 0xfe, 0x49, - 0x18, 0x4f, 0x91, 0xc9, 0x78, 0xe5, 0x35, 0xf3, 0x95, 0x0f, 0xed, 0xee, 0x33, 0x87, 0xec, 0x0b, - 0x74, 0xc8, 0x44, 0xa2, 0x7d, 0xe0, 0x91, 0x3e, 0x7c, 0xdb, 0xa9, 0xfd, 0x45, 0xa1, 0xcf, 0x7a, - 0x1a, 0x4f, 0x40, 0xb9, 0x15, 0x78, 0x6e, 0xcd, 0x55, 0x95, 0xbf, 0x59, 0x05, 0x8f, 0x55, 0xd1, - 0x86, 0x15, 0x14, 0xdd, 0x84, 0xca, 0x8d, 0x9b, 0x31, 0x3f, 0x8f, 0x13, 0xe7, 0x06, 0x79, 0x1d, - 0xc3, 0x29, 0xa3, 0x45, 0x1d, 0xf8, 0x61, 0xcd, 0x0b, 0xd9, 0x30, 0xc8, 0x94, 0xa0, 0x4c, 0xba, - 0x63, 0x67, 0x1a, 0x4c, 0x3b, 0x46, 0x58, 0x40, 0xec, 0x6f, 0x03, 0x9c, 0xc8, 0xba, 0x53, 0x08, - 0xbd, 0x0f, 0x06, 0x79, 0x1f, 0xf3, 0xb9, 0xb6, 0x2e, 0x8b, 0xc7, 0x05, 0x46, 0x50, 0x74, 0x8b, - 0xfd, 0xc6, 0x82, 0xa7, 0xe0, 0xee, 0x39, 0xeb, 0x62, 0x86, 0x1c, 0x0d, 0xf7, 0x25, 0x47, 0x73, - 0x5f, 0x72, 0x38, 0x77, 0xcf, 0x59, 0x47, 0x3b, 0x50, 0x6a, 0xb8, 0x31, 0x71, 0x84, 0x73, 0xe6, - 0xfa, 0x91, 0x30, 0x27, 0x0e, 0xb7, 0xd2, 0xd8, 0x4f, 0xcc, 0x19, 0xa2, 0xcf, 0x5b, 0x30, 0xbe, - 0x9e, 0x2c, 0xe4, 0x23, 0x84, 0xa7, 0x73, 0x04, 0xf7, 0x46, 0x25, 0x19, 0xf1, 0xab, 0x60, 0x53, - 0x8d, 0x38, 0xdd, 0x1d, 0xf4, 0x21, 0x0b, 0x86, 0x36, 0x5c, 0xcf, 0xb8, 0x98, 0xe3, 0x08, 0x3e, - 0xce, 0x79, 0xc6, 0x40, 0xef, 0x38, 0xf8, 0xff, 0x08, 0x4b, 0xce, 0xbd, 0x34, 0xd5, 0xe0, 0x61, - 0x35, 0xd5, 0xd0, 0x3d, 0xd2, 0x54, 0x1f, 0xb5, 0xa0, 0xa2, 0x46, 0x5a, 0x14, 0x44, 0x79, 0xf7, - 0x11, 0x7e, 0x72, 0xee, 0x91, 0x52, 0x7f, 0xb1, 0x66, 0x8e, 0x5e, 0xb7, 0x60, 0xd8, 0x79, 0xad, - 0x1d, 0x92, 0x3a, 0xd9, 0x0e, 0x5a, 0x91, 0xa8, 0x54, 0xfa, 0x72, 0xfe, 0x9d, 0x99, 0xa5, 0x4c, - 0x16, 0xc8, 0xf6, 0x4a, 0x2b, 0x12, 0x09, 0xc1, 0xba, 0x01, 0x9b, 0x5d, 0x40, 0x3f, 0xa3, 0xf5, - 0x38, 0xe4, 0x51, 0xaf, 0x3a, 0xab, 0x37, 0x47, 0xad, 0xcc, 0x77, 0x0b, 0x30, 0xb5, 0xcf, 0x28, - 0xa0, 0xe7, 0x61, 0x24, 0x08, 0x1b, 0x8e, 0xef, 0xbe, 0x66, 0x56, 0x17, 0x53, 0x96, 0xe2, 0x8a, - 0x01, 0xc3, 0x09, 0x4c, 0xb3, 0xec, 0x4c, 0x61, 0x9f, 0xb2, 0x33, 0x67, 0x60, 0x20, 0x24, 0xad, - 0x20, 0xbd, 0xe1, 0x61, 0xc9, 0x75, 0x0c, 0x82, 0x1e, 0x81, 0xa2, 0xd3, 0x72, 0x85, 0xd7, 0x4f, - 0xed, 0xe3, 0x66, 0x57, 0x17, 0x31, 0x6d, 0x4f, 0x54, 0xc1, 0x2a, 0xdd, 0x95, 0x2a, 0x58, 0x54, - 0x95, 0x89, 0x73, 0xad, 0x41, 0xad, 0xca, 0x92, 0xe7, 0x4d, 0xf6, 0x1b, 0x45, 0x78, 0x64, 0xcf, - 0x39, 0xaf, 0x83, 0xae, 0xad, 0x3d, 0x82, 0xae, 0xe5, 0xf0, 0x14, 0xf6, 0x1b, 0x9e, 0x62, 0x8f, - 0xe1, 0xf9, 0x10, 0x5d, 0xca, 0xb2, 0x2a, 0x5b, 0x3e, 0xb7, 0x99, 0xf7, 0x2a, 0xf2, 0x26, 0x56, - 0xb1, 0x84, 0x62, 0xcd, 0x97, 0xee, 0x63, 0x12, 0x25, 0x57, 0x4a, 0x79, 0xa8, 0xb2, 0x9e, 0x95, - 0xd1, 0xf8, 0xfa, 0xed, 0x55, 0xc7, 0xc5, 0xfe, 0xed, 0x01, 0x78, 0xac, 0x0f, 0x0d, 0x64, 0xce, - 0x62, 0xab, 0xcf, 0x59, 0xfc, 0x1d, 0xfe, 0x99, 0x3e, 0x92, 0xf9, 0x99, 0x70, 0xfe, 0x9f, 0x69, - 0xef, 0x2f, 0xc4, 0x8e, 0x06, 0xfc, 0x88, 0xd4, 0xda, 0x21, 0x4f, 0x40, 0x31, 0x32, 0x6f, 0x17, - 0x45, 0x3b, 0x56, 0x18, 0x74, 0x5f, 0x5a, 0x73, 0xe8, 0xf2, 0x1f, 0xca, 0xa9, 0xc4, 0x86, 0x99, - 0xc4, 0xcb, 0xcd, 0xa2, 0xf9, 0x59, 0x2a, 0x01, 0x38, 0x1b, 0xfb, 0x97, 0x2c, 0x38, 0xdd, 0xdb, - 0x4c, 0x40, 0x4f, 0xc3, 0xf0, 0x3a, 0x0b, 0x07, 0x5c, 0x66, 0x81, 0x43, 0x62, 0xea, 0xb0, 0xf7, - 0xd5, 0xcd, 0xd8, 0xc4, 0x41, 0xf3, 0x30, 0x61, 0xc6, 0x11, 0x2e, 0x1b, 0x11, 0x47, 0xcc, 0x91, - 0xb1, 0x96, 0x06, 0xe2, 0x6e, 0x7c, 0xfb, 0x5b, 0xc5, 0xec, 0x6e, 0x71, 0x73, 0xf2, 0x20, 0xb3, - 0x59, 0xcc, 0xd5, 0x42, 0x1f, 0x12, 0xb7, 0x78, 0xb7, 0x25, 0xee, 0x40, 0x2f, 0x89, 0x8b, 0x16, - 0xe0, 0x98, 0x71, 0xd1, 0x28, 0x2f, 0xba, 0xc2, 0x4f, 0x7f, 0x54, 0xc5, 0xb4, 0xd5, 0x14, 0x1c, - 0x77, 0x3d, 0x71, 0x9f, 0x4f, 0xbd, 0x2f, 0x17, 0xe0, 0x54, 0x4f, 0x0b, 0xfe, 0x2e, 0x69, 0x14, - 0xf3, 0xf3, 0x0f, 0xdc, 0x9d, 0xcf, 0x6f, 0x7e, 0x94, 0xd2, 0xbe, 0x1f, 0xa5, 0x1f, 0xf5, 0xfc, - 0xc7, 0x85, 0x9e, 0x8b, 0x85, 0xee, 0xf8, 0xbe, 0x6b, 0x47, 0xf2, 0x05, 0x18, 0x75, 0x5a, 0x2d, - 0x8e, 0xc7, 0x72, 0x05, 0x52, 0x55, 0x1c, 0x67, 0x4d, 0x20, 0x4e, 0xe2, 0xf6, 0x35, 0xb0, 0x7f, - 0x66, 0x41, 0x05, 0x93, 0x0d, 0x2e, 0xb1, 0xd0, 0x0d, 0x31, 0x44, 0x56, 0x1e, 0xa5, 0xf4, 0xe9, - 0xc0, 0x46, 0x2e, 0xab, 0x2f, 0x9f, 0x35, 0xd8, 0x87, 0xad, 0x09, 0xa0, 0xae, 0x27, 0x2d, 0xf6, - 0xbe, 0x9e, 0xd4, 0xfe, 0x52, 0x85, 0xbe, 0x5e, 0x2b, 0x98, 0x0f, 0x49, 0x3d, 0xa2, 0xdf, 0xb7, - 0x1d, 0x7a, 0x62, 0x92, 0xa8, 0xef, 0x7b, 0x15, 0x2f, 0x61, 0xda, 0x9e, 0x38, 0x08, 0x2c, 0x1c, - 0xa8, 0x86, 0x5d, 0x71, 0xdf, 0x1a, 0x76, 0x2f, 0xc0, 0x68, 0x14, 0x6d, 0xae, 0x86, 0xee, 0xb6, - 0x13, 0x93, 0xcb, 0x44, 0x16, 0xbb, 0xd1, 0xf5, 0x9c, 0xaa, 0x17, 0x35, 0x10, 0x27, 0x71, 0xd1, - 0x05, 0x98, 0xd0, 0x95, 0xe4, 0x48, 0x18, 0xb3, 0x24, 0x3c, 0x3e, 0x13, 0x54, 0x21, 0x13, 0x5d, - 0x7b, 0x4e, 0x20, 0xe0, 0xee, 0x67, 0xa8, 0xcc, 0x4d, 0x34, 0xd2, 0x8e, 0x0c, 0x26, 0x65, 0x6e, - 0x82, 0x0e, 0xed, 0x4b, 0xd7, 0x13, 0x68, 0x19, 0x8e, 0xf3, 0x89, 0x31, 0xdb, 0x6a, 0x19, 0x6f, - 0x34, 0x94, 0xac, 0x5f, 0x7e, 0xa1, 0x1b, 0x05, 0x67, 0x3d, 0x87, 0x9e, 0x83, 0x61, 0xd5, 0xbc, - 0xb8, 0x20, 0xce, 0xb0, 0x94, 0x0f, 0x4d, 0x91, 0x59, 0xac, 0x63, 0x13, 0x0f, 0xbd, 0x0b, 0x1e, - 0xd4, 0x7f, 0x79, 0x52, 0x37, 0x3f, 0xd8, 0x5d, 0x10, 0x45, 0x3a, 0xd5, 0xf5, 0x58, 0x17, 0x32, - 0xd1, 0xea, 0xb8, 0xd7, 0xf3, 0x68, 0x1d, 0x4e, 0x2b, 0xd0, 0x39, 0x3f, 0x66, 0x69, 0x97, 0x11, - 0x99, 0x73, 0x22, 0x16, 0xa2, 0x00, 0xec, 0x3d, 0x6d, 0x41, 0xfd, 0xf4, 0x05, 0x37, 0xbe, 0x98, - 0x85, 0x89, 0x97, 0xf0, 0x1e, 0x54, 0xd0, 0x0c, 0x54, 0x88, 0xef, 0xac, 0x7b, 0x64, 0x65, 0x7e, - 0x91, 0x15, 0xfb, 0x34, 0xce, 0x91, 0xcf, 0x49, 0x00, 0xd6, 0x38, 0x2a, 0xe2, 0x7c, 0xa4, 0x57, - 0xc4, 0x39, 0x5a, 0x85, 0x13, 0x8d, 0x5a, 0x8b, 0x5a, 0x8d, 0x6e, 0x8d, 0xcc, 0xd6, 0x58, 0x98, - 0x2c, 0xfd, 0x30, 0xbc, 0xb0, 0xbc, 0x4a, 0xdd, 0xb9, 0x30, 0xbf, 0xda, 0x85, 0x83, 0x33, 0x9f, - 0x64, 0xe1, 0xd4, 0x61, 0xb0, 0xd3, 0x99, 0x3c, 0x9e, 0x0a, 0xa7, 0xa6, 0x8d, 0x98, 0xc3, 0xd0, - 0x25, 0x40, 0x2c, 0x7d, 0xed, 0x62, 0x1c, 0xb7, 0x94, 0x99, 0x3a, 0x79, 0x22, 0x59, 0xb2, 0xef, - 0x7c, 0x17, 0x06, 0xce, 0x78, 0x8a, 0x5a, 0x3d, 0x7e, 0xc0, 0xa8, 0x4f, 0x3e, 0x98, 0xb4, 0x7a, - 0xae, 0xf0, 0x66, 0x2c, 0xe1, 0xe8, 0xc7, 0x61, 0xb2, 0x1d, 0x11, 0xb6, 0x01, 0xbe, 0x1e, 0x84, - 0x5b, 0x5e, 0xe0, 0xd4, 0x17, 0xd9, 0x3d, 0xa8, 0x71, 0x67, 0x72, 0x92, 0x31, 0x3f, 0x23, 0x9e, - 0x9d, 0xbc, 0xda, 0x03, 0x0f, 0xf7, 0xa4, 0x90, 0xae, 0x39, 0x79, 0xaa, 0xcf, 0x9a, 0x93, 0xab, - 0x70, 0x42, 0xea, 0xb5, 0x95, 0xf9, 0x45, 0xf5, 0xd2, 0x93, 0xa7, 0x93, 0x17, 0xab, 0x2d, 0x66, - 0xe0, 0xe0, 0xcc, 0x27, 0xed, 0x3f, 0xb5, 0x60, 0x54, 0x49, 0xb0, 0xbb, 0x90, 0x46, 0xeb, 0x25, - 0xd3, 0x68, 0x2f, 0x1c, 0x5e, 0x07, 0xb0, 0x9e, 0xf7, 0x48, 0xfa, 0xf8, 0xf4, 0x28, 0x80, 0xd6, - 0x13, 0x4a, 0x45, 0x5b, 0x3d, 0x55, 0xf4, 0x7d, 0x2b, 0xa3, 0xb3, 0x6a, 0x08, 0x96, 0xee, 0x6d, - 0x0d, 0xc1, 0x2a, 0x9c, 0x94, 0x53, 0x8a, 0x9f, 0xdd, 0x5e, 0x0c, 0x22, 0x25, 0xf2, 0x8d, 0x9b, - 0xf2, 0x16, 0xb3, 0x90, 0x70, 0xf6, 0xb3, 0x09, 0xdb, 0x6e, 0x68, 0x5f, 0xdb, 0x4e, 0x49, 0xb9, - 0xa5, 0x0d, 0x79, 0x8f, 0x65, 0x4a, 0xca, 0x2d, 0x9d, 0xaf, 0x62, 0x8d, 0x93, 0xad, 0xea, 0x2a, - 0x39, 0xa9, 0x3a, 0x38, 0xb0, 0xaa, 0x93, 0x42, 0x77, 0xb8, 0xa7, 0xd0, 0x95, 0x67, 0x44, 0x23, - 0x3d, 0xcf, 0x88, 0xde, 0x09, 0x63, 0xae, 0xbf, 0x49, 0x42, 0x37, 0x26, 0x75, 0xb6, 0x16, 0x98, - 0x40, 0x2e, 0x6b, 0x43, 0x67, 0x31, 0x01, 0xc5, 0x29, 0xec, 0xa4, 0xa6, 0x18, 0xeb, 0x43, 0x53, - 0xf4, 0xd0, 0xcf, 0xe3, 0xf9, 0xe8, 0xe7, 0x63, 0x87, 0xd7, 0xcf, 0x13, 0x47, 0xaa, 0x9f, 0x51, - 0x2e, 0xfa, 0xb9, 0x2f, 0xd5, 0x67, 0x6c, 0xd2, 0x4f, 0xec, 0xb3, 0x49, 0xef, 0xa5, 0x9c, 0x4f, - 0xde, 0xb1, 0x72, 0xce, 0xd6, 0xbb, 0x0f, 0xbc, 0xa9, 0x77, 0x73, 0xd1, 0xbb, 0x1f, 0x2d, 0xc0, - 0x49, 0xad, 0x99, 0xa8, 0x3c, 0x70, 0x37, 0xa8, 0x6c, 0x66, 0x97, 0x43, 0xf3, 0x93, 0x65, 0x23, - 0x79, 0x5b, 0xa7, 0xaf, 0x2b, 0x08, 0x36, 0xb0, 0x58, 0x0e, 0x34, 0x09, 0xd9, 0xb5, 0x24, 0x69, - 0xb5, 0x35, 0x2f, 0xda, 0xb1, 0xc2, 0xa0, 0x83, 0x40, 0x7f, 0x8b, 0x12, 0x1c, 0xe9, 0x82, 0xd7, - 0xf3, 0x1a, 0x84, 0x4d, 0x3c, 0xf4, 0x04, 0x67, 0xc2, 0x44, 0x26, 0x55, 0x5d, 0x23, 0x7c, 0x5b, - 0xa9, 0xa4, 0xa4, 0x82, 0xca, 0xee, 0xb0, 0x1c, 0xfd, 0x52, 0x77, 0x77, 0x58, 0x90, 0xa6, 0xc2, - 0xb0, 0xff, 0xa7, 0x05, 0xa7, 0x32, 0x87, 0xe2, 0x2e, 0x98, 0x23, 0x3b, 0x49, 0x73, 0xa4, 0x9a, - 0xd7, 0x96, 0xd4, 0x78, 0x8b, 0x1e, 0xa6, 0xc9, 0x7f, 0xb4, 0x60, 0x4c, 0xe3, 0xdf, 0x85, 0x57, - 0x75, 0x93, 0xaf, 0x9a, 0xdf, 0xee, 0xbb, 0xd2, 0xf5, 0x6e, 0xbf, 0x57, 0x00, 0x55, 0x84, 0x7e, - 0xb6, 0x26, 0xaf, 0xf8, 0xd8, 0x27, 0xd6, 0xa1, 0x03, 0x83, 0x2c, 0x54, 0x23, 0xca, 0x27, 0x0c, - 0x2d, 0xc9, 0x9f, 0x85, 0x7d, 0xe8, 0x93, 0x33, 0xf6, 0x37, 0xc2, 0x82, 0x21, 0xbb, 0x34, 0x87, - 0xd7, 0xf7, 0xae, 0x8b, 0x0c, 0x52, 0x7d, 0x69, 0x8e, 0x68, 0xc7, 0x0a, 0x83, 0x2a, 0x4c, 0xb7, - 0x16, 0xf8, 0xf3, 0x9e, 0x13, 0x45, 0xc2, 0x86, 0x53, 0x0a, 0x73, 0x51, 0x02, 0xb0, 0xc6, 0x61, - 0x51, 0x1c, 0x6e, 0xd4, 0xf2, 0x9c, 0x8e, 0xe1, 0x63, 0x31, 0x4a, 0x4d, 0x29, 0x10, 0x36, 0xf1, - 0xec, 0x26, 0x4c, 0x26, 0x5f, 0x62, 0x81, 0x6c, 0xb0, 0x10, 0xea, 0xbe, 0x86, 0x73, 0x06, 0x2a, - 0x0e, 0x7b, 0x6a, 0xa9, 0xed, 0x08, 0x99, 0xa0, 0x03, 0x89, 0x25, 0x00, 0x6b, 0x1c, 0xfb, 0x9f, - 0x5a, 0x70, 0x3c, 0x63, 0xd0, 0x72, 0x4c, 0x95, 0x8e, 0xb5, 0xb4, 0xc9, 0x32, 0x75, 0xbe, 0x0f, - 0x86, 0xea, 0x64, 0xc3, 0x91, 0x41, 0xba, 0x66, 0x4c, 0x3f, 0x6f, 0xc6, 0x12, 0x6e, 0xff, 0x56, - 0x01, 0xc6, 0x93, 0x7d, 0x8d, 0x58, 0x12, 0x21, 0x1f, 0x26, 0x37, 0xaa, 0x05, 0xdb, 0x24, 0xec, - 0xd0, 0x37, 0xb7, 0x52, 0x49, 0x84, 0x5d, 0x18, 0x38, 0xe3, 0x29, 0x76, 0x05, 0x45, 0x5d, 0x8d, - 0xb6, 0x9c, 0x91, 0xd7, 0xf2, 0x9c, 0x91, 0xfa, 0x63, 0x9a, 0x01, 0x3d, 0x8a, 0x25, 0x36, 0xf9, - 0x53, 0x93, 0x8b, 0x65, 0x65, 0xcc, 0xb5, 0x5d, 0x2f, 0x76, 0x7d, 0xf1, 0xca, 0x62, 0xae, 0x2a, - 0x93, 0x6b, 0xb9, 0x1b, 0x05, 0x67, 0x3d, 0x67, 0x7f, 0x73, 0x00, 0x54, 0x19, 0x10, 0x16, 0x70, - 0x99, 0x53, 0xb8, 0xea, 0x41, 0x53, 0x51, 0xd5, 0xdc, 0x1a, 0xd8, 0x2b, 0x02, 0x8a, 0x3b, 0xe6, - 0x4c, 0x0f, 0xbe, 0x1a, 0xb0, 0x35, 0x0d, 0xc2, 0x26, 0x1e, 0xed, 0x89, 0xe7, 0x6e, 0x13, 0xfe, - 0xd0, 0x60, 0xb2, 0x27, 0x4b, 0x12, 0x80, 0x35, 0x0e, 0xab, 0x38, 0xed, 0x6e, 0x6c, 0x08, 0x2f, - 0x93, 0xae, 0x38, 0xed, 0x6e, 0x6c, 0x60, 0x06, 0xe1, 0x97, 0x14, 0x05, 0x5b, 0x62, 0x9b, 0x61, - 0x5c, 0x52, 0x14, 0x6c, 0x61, 0x06, 0xa1, 0x5f, 0xc9, 0x0f, 0xc2, 0xa6, 0xe3, 0xb9, 0xaf, 0x91, - 0xba, 0xe2, 0x22, 0xb6, 0x17, 0xea, 0x2b, 0x5d, 0xe9, 0x46, 0xc1, 0x59, 0xcf, 0xd1, 0x09, 0xdd, - 0x0a, 0x49, 0xdd, 0xad, 0xc5, 0x26, 0x35, 0x48, 0x4e, 0xe8, 0xd5, 0x2e, 0x0c, 0x9c, 0xf1, 0x14, - 0x9a, 0x85, 0x71, 0x59, 0xc6, 0x45, 0x96, 0x3e, 0x1c, 0x4e, 0xd6, 0x4f, 0xc3, 0x49, 0x30, 0x4e, - 0xe3, 0x53, 0x21, 0xd9, 0x14, 0x85, 0x5b, 0xd9, 0x6e, 0xc4, 0x10, 0x92, 0xb2, 0xa0, 0x2b, 0x56, - 0x18, 0xf6, 0x07, 0x8b, 0x54, 0xa9, 0xf7, 0xa8, 0x8f, 0x7c, 0xd7, 0xc2, 0xa3, 0x93, 0x33, 0x72, - 0xa0, 0x8f, 0x19, 0xf9, 0x2c, 0x8c, 0xdc, 0x88, 0x02, 0x5f, 0x85, 0x1e, 0x97, 0x7a, 0x86, 0x1e, - 0x1b, 0x58, 0xd9, 0xa1, 0xc7, 0x83, 0x79, 0x85, 0x1e, 0x0f, 0xdd, 0x61, 0xe8, 0xf1, 0x1f, 0x94, - 0x40, 0xdd, 0x42, 0x79, 0x85, 0xc4, 0x37, 0x83, 0x70, 0xcb, 0xf5, 0x1b, 0xac, 0x24, 0xc9, 0xe7, - 0x2d, 0x59, 0xd5, 0x64, 0xc9, 0x4c, 0xc9, 0xdd, 0xc8, 0xe9, 0x26, 0xc1, 0x04, 0xb3, 0xe9, 0x35, - 0x83, 0x11, 0x0f, 0x61, 0x49, 0x55, 0x4f, 0x11, 0x87, 0x06, 0x89, 0x1e, 0xa1, 0x9f, 0x04, 0x90, - 0x2e, 0xf9, 0x0d, 0x29, 0x81, 0x17, 0xf3, 0xe9, 0x1f, 0x26, 0x1b, 0xda, 0xa4, 0x5e, 0x53, 0x4c, - 0xb0, 0xc1, 0x10, 0x7d, 0x54, 0xa7, 0x2b, 0xf3, 0x1c, 0xa5, 0xf7, 0x1e, 0xc9, 0xd8, 0xf4, 0x93, - 0xac, 0x8c, 0x61, 0xc8, 0xf5, 0x1b, 0x74, 0x9e, 0x88, 0x10, 0xcd, 0xb7, 0x65, 0x55, 0xbc, 0x5a, - 0x0a, 0x9c, 0xfa, 0x9c, 0xe3, 0x39, 0x7e, 0x8d, 0x84, 0x8b, 0x1c, 0x5d, 0x6b, 0x50, 0xd1, 0x80, - 0x25, 0xa1, 0xae, 0xab, 0x32, 0x4b, 0xfd, 0x5c, 0x95, 0x79, 0xfa, 0x47, 0x60, 0xa2, 0xeb, 0x63, - 0x1e, 0x28, 0x37, 0xf9, 0x10, 0xb5, 0xae, 0x7e, 0x7b, 0x50, 0x2b, 0xad, 0x2b, 0x41, 0x9d, 0xdf, - 0xbc, 0x18, 0xea, 0x2f, 0x2a, 0x4c, 0xe6, 0x1c, 0xa7, 0x88, 0x52, 0x33, 0x46, 0x23, 0x36, 0x59, - 0xd2, 0x39, 0xda, 0x72, 0x42, 0xe2, 0x1f, 0xf5, 0x1c, 0x5d, 0x55, 0x4c, 0xb0, 0xc1, 0x10, 0x6d, - 0x26, 0x92, 0xe8, 0xce, 0x1f, 0x3e, 0x89, 0x8e, 0xd5, 0x1f, 0xcd, 0xba, 0xa0, 0xec, 0x75, 0x0b, - 0xc6, 0xfc, 0xc4, 0xcc, 0xcd, 0x27, 0x6e, 0x3e, 0x7b, 0x55, 0xf0, 0x4b, 0x8c, 0x93, 0x6d, 0x38, - 0xc5, 0x3f, 0x4b, 0xa5, 0x95, 0x0e, 0xa8, 0xd2, 0xf4, 0xcd, 0xaf, 0x83, 0xbd, 0x6e, 0x7e, 0x45, - 0xbe, 0xba, 0x92, 0x7b, 0x28, 0x8f, 0xba, 0x1f, 0x89, 0xfb, 0xb8, 0x21, 0xe3, 0x2e, 0xee, 0xeb, - 0x66, 0x8e, 0xed, 0xc1, 0xaf, 0x66, 0x1e, 0xed, 0x95, 0x8b, 0x6b, 0xff, 0x9f, 0x01, 0x38, 0x26, - 0x47, 0x44, 0xe6, 0xdc, 0x50, 0xfd, 0xc8, 0xf9, 0x6a, 0x5b, 0x59, 0xe9, 0xc7, 0x8b, 0x12, 0x80, - 0x35, 0x0e, 0xb5, 0xc7, 0xda, 0x11, 0x59, 0x69, 0x11, 0x7f, 0xc9, 0x5d, 0x8f, 0xc4, 0xf1, 0xbb, - 0x5a, 0x28, 0x57, 0x35, 0x08, 0x9b, 0x78, 0x2c, 0x11, 0xd8, 0x30, 0x5a, 0xcd, 0x44, 0x60, 0x61, - 0xa8, 0x4a, 0x38, 0xfa, 0x4c, 0xe6, 0x85, 0x0d, 0xf9, 0x64, 0xaa, 0x76, 0xa5, 0x1a, 0x1d, 0xec, - 0xa6, 0x06, 0xf4, 0x0f, 0x2d, 0x38, 0xc9, 0x5b, 0xe5, 0x48, 0x5e, 0x6d, 0xd5, 0x9d, 0x98, 0x44, - 0xf9, 0x5c, 0x6e, 0x95, 0xd1, 0x3f, 0xed, 0x45, 0xcf, 0x62, 0x8b, 0xb3, 0x7b, 0x83, 0x3e, 0x65, - 0xc1, 0xf8, 0x56, 0xa2, 0xec, 0x94, 0x54, 0x1d, 0x87, 0xad, 0xeb, 0x92, 0x20, 0xaa, 0x97, 0x5a, - 0xb2, 0x3d, 0xc2, 0x69, 0xee, 0xf6, 0x5f, 0x5a, 0x60, 0x8a, 0xd1, 0xbb, 0x5f, 0xad, 0xea, 0xe0, - 0xa6, 0xa0, 0xb4, 0x2e, 0x4b, 0x3d, 0xad, 0xcb, 0x47, 0xa0, 0xd8, 0x76, 0xeb, 0x62, 0x7f, 0xa1, - 0x0f, 0xfc, 0x17, 0x17, 0x30, 0x6d, 0xb7, 0xbf, 0x51, 0xd2, 0x6e, 0x10, 0x91, 0x08, 0xfa, 0x5d, - 0xf1, 0xda, 0x1b, 0xaa, 0x0c, 0x2d, 0x7f, 0xf3, 0x2b, 0x5d, 0x65, 0x68, 0x7f, 0xe8, 0xe0, 0x79, - 0xbe, 0x7c, 0x80, 0x7a, 0x55, 0xa1, 0x1d, 0xda, 0x27, 0xc9, 0xf7, 0x06, 0x94, 0xe9, 0x16, 0x8c, - 0xf9, 0x33, 0xcb, 0x89, 0x4e, 0x95, 0x2f, 0x8a, 0xf6, 0xdb, 0xbb, 0x53, 0x3f, 0x78, 0xf0, 0x6e, - 0xc9, 0xa7, 0xb1, 0xa2, 0x8f, 0x22, 0xa8, 0xd0, 0xdf, 0x2c, 0x1f, 0x59, 0x6c, 0xee, 0xae, 0x2a, - 0x99, 0x29, 0x01, 0xb9, 0x24, 0x3b, 0x6b, 0x3e, 0xc8, 0x87, 0x0a, 0x45, 0xe4, 0x4c, 0xf9, 0x1e, - 0x70, 0x55, 0x65, 0x05, 0x4b, 0xc0, 0xed, 0xdd, 0xa9, 0x17, 0x0e, 0xce, 0x54, 0x3d, 0x8e, 0x35, - 0x0b, 0x43, 0x35, 0x0e, 0xf7, 0xbc, 0x14, 0xfd, 0xff, 0x0e, 0xe8, 0xf9, 0x2d, 0x2a, 0x14, 0x7f, - 0x57, 0xcc, 0xef, 0xe7, 0x53, 0xf3, 0xfb, 0x4c, 0xd7, 0xfc, 0x1e, 0xa3, 0x63, 0x96, 0x51, 0x37, - 0xf9, 0x6e, 0x1b, 0x0b, 0xfb, 0xfb, 0x24, 0x98, 0x95, 0xf4, 0x6a, 0xdb, 0x0d, 0x49, 0xb4, 0x1a, - 0xb6, 0x7d, 0xd7, 0x6f, 0xb0, 0x29, 0x5b, 0x36, 0xad, 0xa4, 0x04, 0x18, 0xa7, 0xf1, 0xe9, 0xc6, - 0x9f, 0xce, 0x8b, 0xeb, 0xce, 0x36, 0x9f, 0x79, 0x46, 0x75, 0xc8, 0xaa, 0x68, 0xc7, 0x0a, 0x03, - 0x6d, 0xc2, 0xc3, 0x92, 0xc0, 0x02, 0xf1, 0x08, 0x7d, 0x21, 0x16, 0xc8, 0x18, 0x36, 0x79, 0xda, - 0x00, 0x8f, 0x45, 0x79, 0xab, 0xa0, 0xf0, 0x30, 0xde, 0x03, 0x17, 0xef, 0x49, 0xc9, 0xfe, 0x02, - 0x0b, 0x5d, 0x30, 0xca, 0x32, 0xd0, 0xd9, 0xe7, 0xb9, 0x4d, 0x57, 0x16, 0xb1, 0x54, 0xb3, 0x6f, - 0x89, 0x36, 0x62, 0x0e, 0x43, 0x37, 0x61, 0x68, 0x9d, 0x5f, 0x96, 0x9e, 0xcf, 0x25, 0x45, 0xe2, - 0xe6, 0x75, 0x56, 0xc0, 0x5a, 0x5e, 0xc3, 0x7e, 0x5b, 0xff, 0xc4, 0x92, 0x9b, 0xfd, 0xd5, 0x12, - 0x8c, 0xcb, 0xf0, 0xb2, 0x8b, 0x6e, 0xc4, 0x22, 0x12, 0xcc, 0xaa, 0xfe, 0x85, 0x7d, 0xab, 0xfa, - 0xbf, 0x07, 0xa0, 0x4e, 0x5a, 0x5e, 0xd0, 0x61, 0xc6, 0xe1, 0xc0, 0x81, 0x8d, 0x43, 0xb5, 0x9f, - 0x58, 0x50, 0x54, 0xb0, 0x41, 0x51, 0x54, 0xee, 0xe4, 0x97, 0x04, 0xa4, 0x2a, 0x77, 0x1a, 0x57, - 0x99, 0x0d, 0xde, 0xdd, 0xab, 0xcc, 0x5c, 0x18, 0xe7, 0x5d, 0x54, 0xc5, 0x0f, 0xee, 0xa0, 0xc6, - 0x01, 0x4b, 0x1f, 0x5b, 0x48, 0x92, 0xc1, 0x69, 0xba, 0xe6, 0x3d, 0x65, 0xe5, 0xbb, 0x7d, 0x4f, - 0xd9, 0xdb, 0xa1, 0x22, 0xbf, 0x73, 0x34, 0x59, 0xd1, 0x85, 0x79, 0xe4, 0x34, 0x88, 0xb0, 0x86, - 0x77, 0xd5, 0x71, 0x81, 0x7b, 0x55, 0xc7, 0xc5, 0x7e, 0xbd, 0x48, 0x77, 0x15, 0xbc, 0x5f, 0x07, - 0xbe, 0xe6, 0xef, 0xa2, 0x71, 0xcd, 0xdf, 0xc1, 0xbe, 0x67, 0x39, 0x75, 0x1d, 0xe0, 0xc3, 0x30, - 0x10, 0x3b, 0x0d, 0x99, 0xed, 0xca, 0xa0, 0x6b, 0x4e, 0x23, 0xc2, 0xac, 0xf5, 0x20, 0x85, 0x8e, - 0x5f, 0x80, 0xd1, 0xc8, 0x6d, 0xf8, 0x4e, 0xdc, 0x0e, 0x89, 0x71, 0x7e, 0xa9, 0x83, 0x74, 0x4c, - 0x20, 0x4e, 0xe2, 0xa2, 0x0f, 0x59, 0x00, 0x21, 0x51, 0x7b, 0x96, 0xc1, 0x3c, 0xe6, 0x90, 0x12, - 0x03, 0x92, 0xae, 0x59, 0x7f, 0x43, 0xed, 0x55, 0x0c, 0xb6, 0xf6, 0x47, 0x2c, 0x98, 0xe8, 0x7a, - 0x0a, 0xb5, 0x60, 0xb0, 0xc6, 0x2e, 0x63, 0xcc, 0xa7, 0xc0, 0x63, 0xf2, 0x62, 0x47, 0xae, 0x9c, - 0x78, 0x1b, 0x16, 0x7c, 0xec, 0x2f, 0x8d, 0xc0, 0x89, 0xea, 0xfc, 0xb2, 0xbc, 0x9a, 0xe7, 0xc8, - 0xd2, 0x77, 0xb3, 0x78, 0xdc, 0xbd, 0xf4, 0xdd, 0x1e, 0xdc, 0x3d, 0x23, 0x7d, 0xd7, 0x33, 0xd2, - 0x77, 0x93, 0xb9, 0x94, 0xc5, 0x3c, 0x72, 0x29, 0xb3, 0x7a, 0xd0, 0x4f, 0x2e, 0xe5, 0x91, 0xe5, - 0xf3, 0xee, 0xd9, 0xa1, 0x03, 0xe5, 0xf3, 0xaa, 0x64, 0xe7, 0x5c, 0x32, 0xc4, 0x7a, 0x7c, 0xaa, - 0xcc, 0x64, 0x67, 0x95, 0x68, 0xca, 0xb3, 0x1f, 0x85, 0xd2, 0x7b, 0x39, 0xff, 0x0e, 0xf4, 0x91, - 0x68, 0x2a, 0x12, 0x30, 0xcd, 0xe4, 0xe6, 0xa1, 0x3c, 0x92, 0x9b, 0xb3, 0xba, 0xb3, 0x6f, 0x72, - 0xf3, 0x0b, 0x30, 0x5a, 0xf3, 0x02, 0x9f, 0xac, 0x86, 0x41, 0x1c, 0xd4, 0x02, 0x79, 0xf5, 0xb5, - 0xbe, 0xc5, 0xd0, 0x04, 0xe2, 0x24, 0x6e, 0xaf, 0xcc, 0xe8, 0xca, 0x61, 0x33, 0xa3, 0xe1, 0x1e, - 0x65, 0x46, 0x1b, 0xb9, 0xbf, 0xc3, 0x79, 0xe4, 0xfe, 0x66, 0x7d, 0x91, 0xbe, 0xee, 0xb6, 0x7e, - 0x83, 0xdf, 0xfc, 0x4e, 0x37, 0x23, 0x5c, 0x0a, 0xb3, 0x23, 0xba, 0xe1, 0xb3, 0xaf, 0x1c, 0xc1, - 0x84, 0xbd, 0x5e, 0xd5, 0x6c, 0xd4, 0x6d, 0xf0, 0xba, 0x09, 0x27, 0x3b, 0x72, 0x98, 0xb4, 0xe4, - 0xcf, 0x16, 0xe0, 0x7b, 0xf6, 0xed, 0x02, 0xba, 0x09, 0x10, 0x3b, 0x0d, 0x31, 0x51, 0xc5, 0x41, - 0xd6, 0x21, 0xe3, 0x8a, 0xd7, 0x24, 0x3d, 0x5e, 0x1c, 0x4b, 0xfd, 0x65, 0x47, 0x44, 0xf2, 0x37, - 0x0b, 0x27, 0x0e, 0xbc, 0xae, 0xda, 0xcc, 0x38, 0xf0, 0x08, 0x66, 0x10, 0x6a, 0x08, 0x85, 0xa4, - 0x41, 0x8d, 0xfb, 0x62, 0xd2, 0x10, 0xc2, 0xac, 0x15, 0x0b, 0x28, 0x7a, 0x0e, 0x86, 0x1d, 0xcf, - 0xe3, 0xe9, 0x7b, 0x24, 0x12, 0xd7, 0x8b, 0xea, 0x22, 0xb1, 0x1a, 0x84, 0x4d, 0x3c, 0xfb, 0x2f, - 0x0a, 0x30, 0xb5, 0x8f, 0x4c, 0xe9, 0x4a, 0xdb, 0x2e, 0xf5, 0x9d, 0xb6, 0x2d, 0xd2, 0x95, 0x06, - 0x7b, 0xa4, 0x2b, 0x3d, 0x07, 0xc3, 0x31, 0x71, 0x9a, 0x22, 0x12, 0x31, 0x5d, 0xfb, 0x70, 0x4d, - 0x83, 0xb0, 0x89, 0x47, 0xa5, 0xd8, 0x98, 0x53, 0xab, 0x91, 0x28, 0x92, 0xf9, 0x48, 0xc2, 0xcb, - 0x9d, 0x5b, 0xb2, 0x13, 0x3b, 0x3c, 0x98, 0x4d, 0xb0, 0xc0, 0x29, 0x96, 0xe9, 0x01, 0xaf, 0xf4, - 0x39, 0xe0, 0xbf, 0x52, 0x80, 0x47, 0xf6, 0xd4, 0x6e, 0x7d, 0xa7, 0x8a, 0xb5, 0x23, 0x12, 0xa6, - 0x27, 0xce, 0xd5, 0x88, 0x84, 0x98, 0x41, 0xf8, 0x28, 0xb5, 0x5a, 0x2a, 0x8a, 0x3c, 0xff, 0xdc, - 0x4a, 0x3e, 0x4a, 0x09, 0x16, 0x38, 0xc5, 0xf2, 0x4e, 0xa7, 0xe5, 0x57, 0x07, 0xe0, 0xb1, 0x3e, - 0x6c, 0x80, 0x1c, 0x73, 0x50, 0x93, 0xf9, 0xd2, 0xc5, 0x7b, 0x94, 0x2f, 0x7d, 0x67, 0xc3, 0xf5, - 0x66, 0x9a, 0x75, 0x5f, 0xb9, 0xae, 0x5f, 0x28, 0xc0, 0xe9, 0xde, 0x06, 0x0b, 0xfa, 0x61, 0x18, - 0x0f, 0x55, 0x48, 0xa2, 0x99, 0x6a, 0x7d, 0x9c, 0xfb, 0xb8, 0x12, 0x20, 0x9c, 0xc6, 0x45, 0xd3, - 0x00, 0x2d, 0x27, 0xde, 0x8c, 0xce, 0xed, 0xb8, 0x51, 0x2c, 0x8a, 0xc6, 0x8d, 0xf1, 0x93, 0x57, - 0xd9, 0x8a, 0x0d, 0x0c, 0xca, 0x8e, 0xfd, 0x5b, 0x08, 0xae, 0x04, 0x31, 0x7f, 0x88, 0x6f, 0x3d, - 0x8f, 0xcb, 0xbb, 0x08, 0x0d, 0x10, 0x4e, 0xe3, 0x52, 0x76, 0xec, 0x6c, 0x9f, 0x77, 0x94, 0xef, - 0x49, 0x19, 0xbb, 0x25, 0xd5, 0x8a, 0x0d, 0x8c, 0x74, 0x12, 0x79, 0x69, 0xff, 0x24, 0x72, 0xfb, - 0x5f, 0x16, 0xe0, 0x54, 0x4f, 0x83, 0xb7, 0x3f, 0x31, 0x75, 0xff, 0x25, 0x7e, 0xdf, 0xe1, 0x0a, - 0x3b, 0x50, 0xc2, 0xb0, 0xfd, 0x67, 0x3d, 0x66, 0x9a, 0x48, 0x06, 0xbe, 0xf3, 0x3a, 0x28, 0xf7, - 0xdf, 0x78, 0x76, 0xe5, 0xff, 0x0e, 0x1c, 0x20, 0xff, 0x37, 0xf5, 0x31, 0x4a, 0x7d, 0x6a, 0x87, - 0xff, 0x3a, 0xd0, 0x73, 0x78, 0xe9, 0x06, 0xb9, 0xaf, 0x13, 0x84, 0x05, 0x38, 0xe6, 0xfa, 0xec, - 0x76, 0xd9, 0x6a, 0x7b, 0x5d, 0xd4, 0x11, 0xe3, 0xc5, 0x72, 0x55, 0xf6, 0xcd, 0x62, 0x0a, 0x8e, - 0xbb, 0x9e, 0xb8, 0x0f, 0xf3, 0xb1, 0xef, 0x6c, 0x48, 0x0f, 0x28, 0xb9, 0x57, 0xe0, 0xa4, 0x1c, - 0x8a, 0x4d, 0x27, 0x24, 0x75, 0xa1, 0x6c, 0x23, 0x91, 0x6f, 0x75, 0x8a, 0xe7, 0x6c, 0x65, 0x20, - 0xe0, 0xec, 0xe7, 0xd8, 0x55, 0xa0, 0x41, 0xcb, 0xad, 0x89, 0xad, 0xa0, 0xbe, 0x0a, 0x94, 0x36, - 0x62, 0x0e, 0xd3, 0xfa, 0xa2, 0x72, 0x77, 0xf4, 0xc5, 0x7b, 0xa0, 0xa2, 0xc6, 0x9b, 0xe7, 0x54, - 0xa8, 0x49, 0xde, 0x95, 0x53, 0xa1, 0x66, 0xb8, 0x81, 0xb5, 0xdf, 0x8d, 0xfb, 0xcf, 0xc0, 0x88, - 0xf2, 0x05, 0xf6, 0x7b, 0x21, 0xab, 0xfd, 0xff, 0x0a, 0x90, 0xba, 0x7b, 0x0c, 0xed, 0x40, 0xa5, - 0x2e, 0xef, 0xbc, 0xcf, 0xa7, 0x58, 0xb3, 0xba, 0x42, 0x5f, 0x1f, 0x84, 0xa9, 0x26, 0xac, 0x99, - 0xa1, 0xf7, 0xf1, 0xba, 0xc8, 0x82, 0x75, 0x21, 0x8f, 0x9c, 0xfc, 0xaa, 0xa2, 0x67, 0xde, 0xb8, - 0x28, 0xdb, 0xb0, 0xc1, 0x0f, 0xc5, 0x50, 0xd9, 0x94, 0x77, 0xac, 0xe5, 0x23, 0xee, 0xd4, 0x95, - 0x6d, 0xdc, 0x44, 0x53, 0x7f, 0xb1, 0x66, 0x64, 0xff, 0x69, 0x01, 0x4e, 0x24, 0x3f, 0x80, 0x38, - 0xb8, 0xfc, 0x35, 0x0b, 0x1e, 0xf4, 0x9c, 0x28, 0xae, 0xb6, 0xd9, 0x46, 0x61, 0xa3, 0xed, 0xad, - 0xa4, 0x4a, 0x68, 0x1f, 0xd6, 0xd9, 0xa2, 0x08, 0xa7, 0xef, 0xe4, 0x9b, 0x7b, 0xe8, 0xd6, 0xee, - 0xd4, 0x83, 0x4b, 0xd9, 0xcc, 0x71, 0xaf, 0x5e, 0xa1, 0xd7, 0x2d, 0x38, 0x56, 0x6b, 0x87, 0x21, - 0xf1, 0x63, 0xdd, 0x55, 0xfe, 0x15, 0xaf, 0xe4, 0x32, 0x90, 0xba, 0x83, 0x27, 0xa8, 0x40, 0x9d, - 0x4f, 0xf1, 0xc2, 0x5d, 0xdc, 0xed, 0x9f, 0xa7, 0x9a, 0xb3, 0xe7, 0x7b, 0xfe, 0x35, 0xbb, 0x44, - 0xf0, 0xdb, 0x83, 0x30, 0x9a, 0xa8, 0x13, 0x9e, 0x38, 0xec, 0xb3, 0xf6, 0x3d, 0xec, 0x63, 0x19, - 0x82, 0x6d, 0x5f, 0xde, 0xaf, 0x6e, 0x64, 0x08, 0xb6, 0x7d, 0x82, 0x39, 0x4c, 0x0c, 0x29, 0x6e, - 0xfb, 0x22, 0x17, 0xc0, 0x1c, 0x52, 0xdc, 0xf6, 0xb1, 0x80, 0xa2, 0x0f, 0x58, 0x30, 0xc2, 0x16, - 0x9f, 0x38, 0x2a, 0x15, 0x0a, 0xed, 0x52, 0x0e, 0xcb, 0x5d, 0xd6, 0xc4, 0x67, 0xb1, 0xa3, 0x66, - 0x0b, 0x4e, 0x70, 0x44, 0x1f, 0xb6, 0xa0, 0xa2, 0x2e, 0x73, 0x15, 0x67, 0x23, 0xd5, 0x7c, 0xcb, - 0xb0, 0xa7, 0xa4, 0x9e, 0xaa, 0x87, 0x8d, 0x35, 0x63, 0x14, 0xa9, 0x73, 0xcc, 0xa1, 0xa3, 0x39, - 0xc7, 0x84, 0x8c, 0x33, 0xcc, 0xb7, 0x43, 0xa5, 0xe9, 0xf8, 0xee, 0x06, 0x89, 0x62, 0x7e, 0xb4, - 0x28, 0x6f, 0xdd, 0x90, 0x8d, 0x58, 0xc3, 0xa9, 0xb1, 0x1f, 0xb1, 0x17, 0x8b, 0x8d, 0xb3, 0x40, - 0x66, 0xec, 0x57, 0x75, 0x33, 0x36, 0x71, 0xcc, 0x83, 0x4b, 0xb8, 0xa7, 0x07, 0x97, 0xc3, 0xfb, - 0x1c, 0x5c, 0x56, 0xe1, 0xa4, 0xd3, 0x8e, 0x83, 0x8b, 0xc4, 0xf1, 0x66, 0xe3, 0x98, 0x34, 0x5b, - 0x71, 0xc4, 0x4b, 0xcb, 0x8f, 0x30, 0x17, 0xb0, 0x8a, 0x76, 0xab, 0x12, 0x6f, 0xa3, 0x0b, 0x09, - 0x67, 0x3f, 0x6b, 0xff, 0x73, 0x0b, 0x4e, 0x66, 0x4e, 0x85, 0xfb, 0x37, 0xcf, 0xc0, 0xfe, 0xc5, - 0x12, 0x1c, 0xcf, 0xb8, 0x45, 0x00, 0x75, 0xcc, 0x45, 0x62, 0xe5, 0x11, 0xb2, 0x97, 0x8c, 0x40, - 0x93, 0xdf, 0x26, 0x63, 0x65, 0x1c, 0x2c, 0x16, 0x41, 0xc7, 0x03, 0x14, 0xef, 0x6e, 0x3c, 0x80, - 0x31, 0xd7, 0x07, 0xee, 0xe9, 0x5c, 0x2f, 0xed, 0x33, 0xd7, 0xbf, 0x68, 0xc1, 0x64, 0xb3, 0xc7, - 0x95, 0x60, 0xe2, 0x3c, 0xe9, 0xda, 0xd1, 0x5c, 0x38, 0x36, 0xf7, 0xf0, 0xad, 0xdd, 0xa9, 0x9e, - 0x37, 0xb1, 0xe1, 0x9e, 0xbd, 0xb2, 0xbf, 0x59, 0x04, 0x66, 0xaf, 0xb1, 0x4a, 0xd1, 0x1d, 0xf4, - 0x7e, 0xf3, 0x32, 0x12, 0x2b, 0xaf, 0x8b, 0x33, 0x38, 0x71, 0x75, 0x99, 0x09, 0x1f, 0xc1, 0xac, - 0xbb, 0x4d, 0xd2, 0x92, 0xb0, 0xd0, 0x87, 0x24, 0xf4, 0xe4, 0xad, 0x2f, 0xc5, 0xfc, 0x6f, 0x7d, - 0xa9, 0xa4, 0x6f, 0x7c, 0xd9, 0xfb, 0x13, 0x0f, 0xdc, 0x97, 0x9f, 0xf8, 0x77, 0x2c, 0x2e, 0x78, - 0x52, 0x5f, 0x41, 0x9b, 0x1b, 0xd6, 0x1e, 0xe6, 0xc6, 0x93, 0x50, 0x8e, 0x84, 0x64, 0x16, 0x66, - 0x89, 0x0e, 0x05, 0x13, 0xed, 0x58, 0x61, 0xd0, 0x5d, 0x97, 0xe3, 0x79, 0xc1, 0xcd, 0x73, 0xcd, - 0x56, 0xdc, 0x11, 0x06, 0x8a, 0xda, 0x16, 0xcc, 0x2a, 0x08, 0x36, 0xb0, 0xd0, 0x63, 0x30, 0xc8, - 0x2b, 0x4d, 0x08, 0xe7, 0xce, 0x30, 0x5d, 0x87, 0xbc, 0x0c, 0x45, 0x1d, 0x0b, 0x90, 0xbd, 0x09, - 0xc6, 0xae, 0xe2, 0xce, 0x2f, 0x68, 0x56, 0x17, 0xbe, 0x16, 0x7a, 0x5d, 0xf8, 0x6a, 0xff, 0xfd, - 0x82, 0x60, 0xc5, 0x77, 0x09, 0x3a, 0x32, 0xd0, 0x3a, 0x60, 0x64, 0xe0, 0xfb, 0x00, 0x6a, 0x41, - 0xb3, 0x45, 0xf7, 0xcd, 0x6b, 0x41, 0x3e, 0x9b, 0xad, 0x79, 0x45, 0x4f, 0x8f, 0xaa, 0x6e, 0xc3, - 0x06, 0xbf, 0x84, 0x68, 0x2f, 0xee, 0x2b, 0xda, 0x13, 0x52, 0x6e, 0x60, 0x6f, 0x29, 0x67, 0xff, - 0x85, 0x05, 0x09, 0xab, 0x0f, 0xb5, 0xa0, 0x44, 0xbb, 0xdb, 0x11, 0x02, 0x63, 0x25, 0x3f, 0x13, - 0x93, 0x4a, 0x6a, 0xb1, 0x0a, 0xd9, 0x4f, 0xcc, 0x19, 0x21, 0x4f, 0x44, 0x41, 0xe6, 0xb2, 0xf9, - 0x31, 0x19, 0x5e, 0x0c, 0x82, 0x2d, 0x1e, 0x4c, 0xa4, 0x23, 0x2a, 0xed, 0xe7, 0x61, 0xa2, 0xab, - 0x53, 0xec, 0x52, 0xe7, 0x40, 0xee, 0xe0, 0x8d, 0xd5, 0xc3, 0x0a, 0x3e, 0x60, 0x0e, 0xb3, 0xbf, - 0x60, 0xc1, 0xb1, 0x34, 0x79, 0xf4, 0x86, 0x05, 0x13, 0x51, 0x9a, 0xde, 0x51, 0x8d, 0x9d, 0xca, - 0x76, 0xe8, 0x02, 0xe1, 0xee, 0x4e, 0xd8, 0xff, 0x43, 0x68, 0x83, 0xeb, 0xae, 0x5f, 0x0f, 0x6e, - 0x2a, 0x3b, 0xc9, 0xea, 0x69, 0x27, 0x51, 0xf1, 0x50, 0xdb, 0x24, 0xf5, 0xb6, 0xd7, 0x55, 0x86, - 0xa2, 0x2a, 0xda, 0xb1, 0xc2, 0x60, 0x59, 0xf7, 0x6d, 0xb1, 0x6f, 0x4d, 0x4d, 0xca, 0x05, 0xd1, - 0x8e, 0x15, 0x06, 0x7a, 0x16, 0x46, 0x8c, 0x97, 0x94, 0xf3, 0x92, 0x6d, 0x3a, 0x0c, 0x0d, 0x1e, - 0xe1, 0x04, 0x16, 0x9a, 0x06, 0x50, 0x36, 0x97, 0xd4, 0xd8, 0xcc, 0xd1, 0xae, 0x04, 0x63, 0x84, - 0x0d, 0x0c, 0x56, 0xe3, 0xc2, 0x6b, 0x47, 0xec, 0x24, 0x79, 0x50, 0xdf, 0x9c, 0x30, 0x2f, 0xda, - 0xb0, 0x82, 0x52, 0xe1, 0xd6, 0x74, 0xfc, 0xb6, 0xe3, 0xd1, 0x11, 0x12, 0xae, 0x33, 0xb5, 0x0c, - 0x97, 0x15, 0x04, 0x1b, 0x58, 0xf4, 0x8d, 0x63, 0xb7, 0x49, 0x5e, 0x0a, 0x7c, 0x19, 0xa5, 0xae, - 0x83, 0x0b, 0x44, 0x3b, 0x56, 0x18, 0xe8, 0x79, 0x18, 0x76, 0xfc, 0x3a, 0x37, 0x10, 0x83, 0x50, - 0x9c, 0x51, 0xaa, 0xdd, 0xe7, 0xd5, 0x88, 0xcc, 0x6a, 0x28, 0x36, 0x51, 0xd3, 0xd7, 0x46, 0x40, - 0x9f, 0xd7, 0xd2, 0xfd, 0xb9, 0x05, 0xe3, 0xba, 0x68, 0x11, 0xf3, 0xb0, 0x25, 0x5c, 0x8b, 0xd6, - 0xbe, 0xae, 0xc5, 0x64, 0xed, 0x92, 0x42, 0x5f, 0xb5, 0x4b, 0xcc, 0xb2, 0x22, 0xc5, 0x3d, 0xcb, - 0x8a, 0x7c, 0x2f, 0x0c, 0x6d, 0x91, 0x8e, 0x51, 0x7f, 0x84, 0x29, 0x87, 0xcb, 0xbc, 0x09, 0x4b, - 0x18, 0xb2, 0x61, 0xb0, 0xe6, 0xa8, 0x1a, 0x86, 0x23, 0x22, 0x36, 0x6d, 0x96, 0x21, 0x09, 0x88, - 0xbd, 0x02, 0x15, 0x75, 0xa8, 0x2f, 0x3d, 0x7d, 0x56, 0xb6, 0xa7, 0xaf, 0xaf, 0xf2, 0x06, 0x73, - 0xeb, 0x5f, 0xf9, 0xd6, 0xa3, 0x6f, 0xf9, 0xa3, 0x6f, 0x3d, 0xfa, 0x96, 0x3f, 0xf9, 0xd6, 0xa3, - 0x6f, 0xf9, 0xc0, 0xad, 0x47, 0xad, 0xaf, 0xdc, 0x7a, 0xd4, 0xfa, 0xa3, 0x5b, 0x8f, 0x5a, 0x7f, - 0x72, 0xeb, 0x51, 0xeb, 0x9b, 0xb7, 0x1e, 0xb5, 0x5e, 0xff, 0x2f, 0x8f, 0xbe, 0xe5, 0xa5, 0xcc, - 0xbc, 0x08, 0xfa, 0xe3, 0xa9, 0x5a, 0x7d, 0x66, 0xfb, 0x19, 0x16, 0x9a, 0x4f, 0xd7, 0xf3, 0x8c, - 0x31, 0x89, 0x67, 0xe4, 0x7a, 0xfe, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0x6a, 0x75, 0xdd, 0xda, - 0x71, 0xff, 0x00, 0x00, + // 12349 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x70, 0x24, 0xc9, + 0x71, 0x18, 0xcc, 0x9e, 0xc1, 0x00, 0x33, 0x89, 0xd7, 0xa2, 0x76, 0xf7, 0x0e, 0xbb, 0xf7, 0xc0, + 0xaa, 0x8f, 0x3a, 0x9e, 0x3e, 0xde, 0x01, 0xba, 0xbd, 0x3b, 0xea, 0x3e, 0x9d, 0x44, 0x09, 0x8f, + 0x7d, 0x60, 0x17, 0x58, 0xe0, 0x6a, 0xb0, 0xbb, 0xe2, 0x51, 0xc7, 0x63, 0x63, 0xa6, 0x30, 0xe8, + 0x45, 0x4f, 0xf7, 0x5c, 0x77, 0x0f, 0x16, 0x73, 0xa2, 0x28, 0x52, 0x24, 0x25, 0x4a, 0x7c, 0x9d, + 0x45, 0x85, 0x79, 0xb4, 0x4d, 0x9a, 0xb2, 0xe4, 0x57, 0x38, 0x18, 0xa2, 0xad, 0x1f, 0x56, 0x58, + 0x52, 0x30, 0x24, 0x39, 0x18, 0x94, 0x65, 0x5b, 0x32, 0x83, 0x16, 0x65, 0x4b, 0x84, 0xc9, 0xb5, + 0x1d, 0x52, 0x38, 0xc2, 0x8a, 0x90, 0xec, 0x1f, 0x8e, 0xb5, 0xc3, 0xe1, 0xa8, 0x77, 0x75, 0x4f, + 0x0f, 0x30, 0x58, 0x34, 0x76, 0x97, 0xd4, 0xfd, 0x9b, 0xa9, 0xcc, 0xce, 0xac, 0xae, 0xae, 0xca, + 0xcc, 0xca, 0xca, 0xcc, 0x82, 0xa5, 0x86, 0x1b, 0x6f, 0xb6, 0xd7, 0xa7, 0x6b, 0x41, 0x73, 0xc6, + 0x09, 0x1b, 0x41, 0x2b, 0x0c, 0x6e, 0xb0, 0x1f, 0x4f, 0xd5, 0xea, 0x33, 0xdb, 0xcf, 0xcc, 0xb4, + 0xb6, 0x1a, 0x33, 0x4e, 0xcb, 0x8d, 0x66, 0x9c, 0x56, 0xcb, 0x73, 0x6b, 0x4e, 0xec, 0x06, 0xfe, + 0xcc, 0xf6, 0xd3, 0x8e, 0xd7, 0xda, 0x74, 0x9e, 0x9e, 0x69, 0x10, 0x9f, 0x84, 0x4e, 0x4c, 0xea, + 0xd3, 0xad, 0x30, 0x88, 0x03, 0xf4, 0x43, 0x9a, 0xda, 0xb4, 0xa4, 0xc6, 0x7e, 0xbc, 0x52, 0xab, + 0x4f, 0x6f, 0x3f, 0x33, 0xdd, 0xda, 0x6a, 0x4c, 0x53, 0x6a, 0xd3, 0x06, 0xb5, 0x69, 0x49, 0xed, + 0xf4, 0x53, 0x46, 0x5f, 0x1a, 0x41, 0x23, 0x98, 0x61, 0x44, 0xd7, 0xdb, 0x1b, 0xec, 0x1f, 0xfb, + 0xc3, 0x7e, 0x71, 0x66, 0xa7, 0xed, 0xad, 0xe7, 0xa3, 0x69, 0x37, 0xa0, 0xdd, 0x9b, 0xa9, 0x05, + 0x21, 0x99, 0xd9, 0xee, 0xea, 0xd0, 0xe9, 0x8b, 0x1a, 0x87, 0xec, 0xc4, 0xc4, 0x8f, 0xdc, 0xc0, + 0x8f, 0x9e, 0xa2, 0x5d, 0x20, 0xe1, 0x36, 0x09, 0xcd, 0xd7, 0x33, 0x10, 0xb2, 0x28, 0x3d, 0xab, + 0x29, 0x35, 0x9d, 0xda, 0xa6, 0xeb, 0x93, 0xb0, 0xa3, 0x1f, 0x6f, 0x92, 0xd8, 0xc9, 0x7a, 0x6a, + 0xa6, 0xd7, 0x53, 0x61, 0xdb, 0x8f, 0xdd, 0x26, 0xe9, 0x7a, 0xe0, 0x1d, 0xfb, 0x3d, 0x10, 0xd5, + 0x36, 0x49, 0xd3, 0xe9, 0x7a, 0xee, 0x99, 0x5e, 0xcf, 0xb5, 0x63, 0xd7, 0x9b, 0x71, 0xfd, 0x38, + 0x8a, 0xc3, 0xf4, 0x43, 0xf6, 0xdf, 0xb1, 0x60, 0x74, 0xf6, 0x7a, 0x75, 0xb6, 0x1d, 0x6f, 0xce, + 0x07, 0xfe, 0x86, 0xdb, 0x40, 0xcf, 0xc1, 0x70, 0xcd, 0x6b, 0x47, 0x31, 0x09, 0xaf, 0x38, 0x4d, + 0x32, 0x69, 0x9d, 0xb1, 0x9e, 0xa8, 0xcc, 0x1d, 0xff, 0xea, 0xee, 0xd4, 0x5b, 0x6e, 0xed, 0x4e, + 0x0d, 0xcf, 0x6b, 0x10, 0x36, 0xf1, 0xd0, 0xf7, 0xc1, 0x50, 0x18, 0x78, 0x64, 0x16, 0x5f, 0x99, + 0x2c, 0xb0, 0x47, 0xc6, 0xc5, 0x23, 0x43, 0x98, 0x37, 0x63, 0x09, 0xa7, 0xa8, 0xad, 0x30, 0xd8, + 0x70, 0x3d, 0x32, 0x59, 0x4c, 0xa2, 0xae, 0xf2, 0x66, 0x2c, 0xe1, 0xf6, 0x67, 0x0b, 0x30, 0x3e, + 0xdb, 0x6a, 0x5d, 0x24, 0x8e, 0x17, 0x6f, 0x56, 0x63, 0x27, 0x6e, 0x47, 0xa8, 0x01, 0x83, 0x11, + 0xfb, 0x25, 0xfa, 0xb6, 0x22, 0x9e, 0x1e, 0xe4, 0xf0, 0xdb, 0xbb, 0x53, 0x3f, 0x9c, 0x35, 0xa3, + 0x1b, 0x6e, 0x1c, 0xb4, 0xa2, 0xa7, 0x88, 0xdf, 0x70, 0x7d, 0xc2, 0xc6, 0x65, 0x93, 0x51, 0x9d, + 0x36, 0x89, 0xcf, 0x07, 0x75, 0x82, 0x05, 0x79, 0xda, 0xcf, 0x26, 0x89, 0x22, 0xa7, 0x41, 0xd2, + 0xaf, 0xb4, 0xcc, 0x9b, 0xb1, 0x84, 0xa3, 0x10, 0x90, 0xe7, 0x44, 0xf1, 0x5a, 0xe8, 0xf8, 0x91, + 0x4b, 0xa7, 0xf4, 0x9a, 0xdb, 0xe4, 0x6f, 0x37, 0x7c, 0xf6, 0xff, 0x9b, 0xe6, 0x1f, 0x66, 0xda, + 0xfc, 0x30, 0x7a, 0x1d, 0xd0, 0x79, 0x33, 0xbd, 0xfd, 0xf4, 0x34, 0x7d, 0x62, 0xee, 0x81, 0x5b, + 0xbb, 0x53, 0x68, 0xa9, 0x8b, 0x12, 0xce, 0xa0, 0x6e, 0xff, 0x51, 0x01, 0x60, 0xb6, 0xd5, 0x5a, + 0x0d, 0x83, 0x1b, 0xa4, 0x16, 0xa3, 0xf7, 0x42, 0x99, 0x92, 0xaa, 0x3b, 0xb1, 0xc3, 0x06, 0x66, + 0xf8, 0xec, 0xf7, 0xf7, 0xc7, 0x78, 0x65, 0x9d, 0x3e, 0xbf, 0x4c, 0x62, 0x67, 0x0e, 0x89, 0x17, + 0x04, 0xdd, 0x86, 0x15, 0x55, 0xe4, 0xc3, 0x40, 0xd4, 0x22, 0x35, 0x36, 0x18, 0xc3, 0x67, 0x97, + 0xa6, 0x0f, 0xb3, 0xd2, 0xa7, 0x75, 0xcf, 0xab, 0x2d, 0x52, 0x9b, 0x1b, 0x11, 0x9c, 0x07, 0xe8, + 0x3f, 0xcc, 0xf8, 0xa0, 0x6d, 0xf5, 0xa1, 0xf9, 0x40, 0x5e, 0xc9, 0x8d, 0x23, 0xa3, 0x3a, 0x37, + 0x96, 0x9c, 0x38, 0xf2, 0xbb, 0xdb, 0xdf, 0xb4, 0x60, 0x4c, 0x23, 0x2f, 0xb9, 0x51, 0x8c, 0x7e, + 0xbc, 0x6b, 0x70, 0xa7, 0xfb, 0x1b, 0x5c, 0xfa, 0x34, 0x1b, 0xda, 0x63, 0x82, 0x59, 0x59, 0xb6, + 0x18, 0x03, 0xdb, 0x84, 0x92, 0x1b, 0x93, 0x66, 0x34, 0x59, 0x38, 0x53, 0x7c, 0x62, 0xf8, 0xec, + 0xc5, 0xbc, 0xde, 0x73, 0x6e, 0x54, 0x30, 0x2d, 0x2d, 0x52, 0xf2, 0x98, 0x73, 0xb1, 0xff, 0x6a, + 0xd4, 0x7c, 0x3f, 0x3a, 0xe0, 0xe8, 0x69, 0x18, 0x8e, 0x82, 0x76, 0x58, 0x23, 0x98, 0xb4, 0x02, + 0xba, 0xb0, 0x8a, 0x74, 0xba, 0xd3, 0x05, 0x5f, 0xd5, 0xcd, 0xd8, 0xc4, 0x41, 0x9f, 0xb4, 0x60, + 0xa4, 0x4e, 0xa2, 0xd8, 0xf5, 0x19, 0x7f, 0xd9, 0xf9, 0xb5, 0x43, 0x77, 0x5e, 0x36, 0x2e, 0x68, + 0xe2, 0x73, 0x27, 0xc4, 0x8b, 0x8c, 0x18, 0x8d, 0x11, 0x4e, 0xf0, 0xa7, 0x82, 0xab, 0x4e, 0xa2, + 0x5a, 0xe8, 0xb6, 0xe8, 0x7f, 0x21, 0x5a, 0x94, 0xe0, 0x5a, 0xd0, 0x20, 0x6c, 0xe2, 0x21, 0x1f, + 0x4a, 0x54, 0x30, 0x45, 0x93, 0x03, 0xac, 0xff, 0x8b, 0x87, 0xeb, 0xbf, 0x18, 0x54, 0x2a, 0xf3, + 0xf4, 0xe8, 0xd3, 0x7f, 0x11, 0xe6, 0x6c, 0xd0, 0x27, 0x2c, 0x98, 0x14, 0x82, 0x13, 0x13, 0x3e, + 0xa0, 0xd7, 0x37, 0xdd, 0x98, 0x78, 0x6e, 0x14, 0x4f, 0x96, 0x58, 0x1f, 0x66, 0xfa, 0x9b, 0x5b, + 0x17, 0xc2, 0xa0, 0xdd, 0xba, 0xec, 0xfa, 0xf5, 0xb9, 0x33, 0x82, 0xd3, 0xe4, 0x7c, 0x0f, 0xc2, + 0xb8, 0x27, 0x4b, 0xf4, 0x69, 0x0b, 0x4e, 0xfb, 0x4e, 0x93, 0x44, 0x2d, 0x87, 0x7e, 0x5a, 0x0e, + 0x9e, 0xf3, 0x9c, 0xda, 0x16, 0xeb, 0xd1, 0xe0, 0x9d, 0xf5, 0xc8, 0x16, 0x3d, 0x3a, 0x7d, 0xa5, + 0x27, 0x69, 0xbc, 0x07, 0x5b, 0xf4, 0xcb, 0x16, 0x4c, 0x04, 0x61, 0x6b, 0xd3, 0xf1, 0x49, 0x5d, + 0x42, 0xa3, 0xc9, 0x21, 0xb6, 0xf4, 0xde, 0x73, 0xb8, 0x4f, 0xb4, 0x92, 0x26, 0xbb, 0x1c, 0xf8, + 0x6e, 0x1c, 0x84, 0x55, 0x12, 0xc7, 0xae, 0xdf, 0x88, 0xe6, 0x4e, 0xde, 0xda, 0x9d, 0x9a, 0xe8, + 0xc2, 0xc2, 0xdd, 0xfd, 0x41, 0x3f, 0x01, 0xc3, 0x51, 0xc7, 0xaf, 0x5d, 0x77, 0xfd, 0x7a, 0x70, + 0x33, 0x9a, 0x2c, 0xe7, 0xb1, 0x7c, 0xab, 0x8a, 0xa0, 0x58, 0x80, 0x9a, 0x01, 0x36, 0xb9, 0x65, + 0x7f, 0x38, 0x3d, 0x95, 0x2a, 0x79, 0x7f, 0x38, 0x3d, 0x99, 0xf6, 0x60, 0x8b, 0x7e, 0xd6, 0x82, + 0xd1, 0xc8, 0x6d, 0xf8, 0x4e, 0xdc, 0x0e, 0xc9, 0x65, 0xd2, 0x89, 0x26, 0x81, 0x75, 0xe4, 0xd2, + 0x21, 0x47, 0xc5, 0x20, 0x39, 0x77, 0x52, 0xf4, 0x71, 0xd4, 0x6c, 0x8d, 0x70, 0x92, 0x6f, 0xd6, + 0x42, 0xd3, 0xd3, 0x7a, 0x38, 0xdf, 0x85, 0xa6, 0x27, 0x75, 0x4f, 0x96, 0xe8, 0x47, 0xe1, 0x18, + 0x6f, 0x52, 0x23, 0x1b, 0x4d, 0x8e, 0x30, 0x41, 0x7b, 0xe2, 0xd6, 0xee, 0xd4, 0xb1, 0x6a, 0x0a, + 0x86, 0xbb, 0xb0, 0xd1, 0xab, 0x30, 0xd5, 0x22, 0x61, 0xd3, 0x8d, 0x57, 0x7c, 0xaf, 0x23, 0xc5, + 0x77, 0x2d, 0x68, 0x91, 0xba, 0xe8, 0x4e, 0x34, 0x39, 0x7a, 0xc6, 0x7a, 0xa2, 0x3c, 0xf7, 0x36, + 0xd1, 0xcd, 0xa9, 0xd5, 0xbd, 0xd1, 0xf1, 0x7e, 0xf4, 0xd0, 0x57, 0x2c, 0x38, 0x6d, 0x48, 0xd9, + 0x2a, 0x09, 0xb7, 0xdd, 0x1a, 0x99, 0xad, 0xd5, 0x82, 0xb6, 0x1f, 0x47, 0x93, 0x63, 0x6c, 0x18, + 0xd7, 0x8f, 0x42, 0xe6, 0x27, 0x59, 0xe9, 0x79, 0xd9, 0x13, 0x25, 0xc2, 0x7b, 0xf4, 0xd4, 0xfe, + 0xbd, 0x02, 0x1c, 0x4b, 0x5b, 0x00, 0xe8, 0x1f, 0x58, 0x30, 0x7e, 0xe3, 0x66, 0xbc, 0x16, 0x6c, + 0x11, 0x3f, 0x9a, 0xeb, 0x50, 0x39, 0xcd, 0x74, 0xdf, 0xf0, 0xd9, 0x5a, 0xbe, 0xb6, 0xc6, 0xf4, + 0xa5, 0x24, 0x97, 0x73, 0x7e, 0x1c, 0x76, 0xe6, 0x1e, 0x14, 0xef, 0x34, 0x7e, 0xe9, 0xfa, 0x9a, + 0x09, 0xc5, 0xe9, 0x4e, 0x9d, 0xfe, 0x98, 0x05, 0x27, 0xb2, 0x48, 0xa0, 0x63, 0x50, 0xdc, 0x22, + 0x1d, 0x6e, 0x09, 0x63, 0xfa, 0x13, 0xbd, 0x0c, 0xa5, 0x6d, 0xc7, 0x6b, 0x13, 0x61, 0xa6, 0x5d, + 0x38, 0xdc, 0x8b, 0xa8, 0x9e, 0x61, 0x4e, 0xf5, 0x07, 0x0b, 0xcf, 0x5b, 0xf6, 0x1f, 0x14, 0x61, + 0xd8, 0xf8, 0x68, 0x77, 0xc1, 0xf4, 0x0c, 0x12, 0xa6, 0xe7, 0x72, 0x6e, 0xf3, 0xad, 0xa7, 0xed, + 0x79, 0x33, 0x65, 0x7b, 0xae, 0xe4, 0xc7, 0x72, 0x4f, 0xe3, 0x13, 0xc5, 0x50, 0x09, 0x5a, 0x74, + 0x8b, 0x46, 0x6d, 0x98, 0x81, 0x3c, 0x3e, 0xe1, 0x8a, 0x24, 0x37, 0x37, 0x7a, 0x6b, 0x77, 0xaa, + 0xa2, 0xfe, 0x62, 0xcd, 0xc8, 0xfe, 0x86, 0x05, 0x27, 0x8c, 0x3e, 0xce, 0x07, 0x7e, 0x9d, 0x6d, + 0x34, 0xd0, 0x19, 0x18, 0x88, 0x3b, 0x2d, 0xb9, 0x0d, 0x54, 0x23, 0xb5, 0xd6, 0x69, 0x11, 0xcc, + 0x20, 0xf7, 0xfb, 0x2e, 0xe9, 0xd3, 0x16, 0x3c, 0x90, 0x2d, 0x60, 0xd0, 0xe3, 0x30, 0xc8, 0x7d, + 0x00, 0xe2, 0xed, 0xf4, 0x27, 0x61, 0xad, 0x58, 0x40, 0xd1, 0x0c, 0x54, 0x94, 0xc2, 0x13, 0xef, + 0x38, 0x21, 0x50, 0x2b, 0x5a, 0x4b, 0x6a, 0x1c, 0x3a, 0x68, 0xf4, 0x8f, 0x30, 0x41, 0xd5, 0xa0, + 0xb1, 0x4d, 0x33, 0x83, 0xd8, 0x5f, 0xb7, 0xe0, 0xad, 0xfd, 0x88, 0xbd, 0xa3, 0xeb, 0x63, 0x15, + 0x4e, 0xd6, 0xc9, 0x86, 0xd3, 0xf6, 0xe2, 0x24, 0x47, 0xd1, 0xe9, 0x47, 0xc4, 0xc3, 0x27, 0x17, + 0xb2, 0x90, 0x70, 0xf6, 0xb3, 0xf6, 0x7f, 0xb2, 0xd8, 0x76, 0x5d, 0xbe, 0xd6, 0x5d, 0xd8, 0x3a, + 0xf9, 0xc9, 0xad, 0xd3, 0x62, 0x6e, 0xcb, 0xb4, 0xc7, 0xde, 0xe9, 0x13, 0x16, 0x9c, 0x36, 0xb0, + 0x96, 0x9d, 0xb8, 0xb6, 0x79, 0x6e, 0xa7, 0x15, 0x92, 0x28, 0xa2, 0x53, 0xea, 0x11, 0x43, 0x1c, + 0xcf, 0x0d, 0x0b, 0x0a, 0xc5, 0xcb, 0xa4, 0xc3, 0x65, 0xf3, 0x93, 0x50, 0xe6, 0x6b, 0x2e, 0x08, + 0xc5, 0x47, 0x52, 0xef, 0xb6, 0x22, 0xda, 0xb1, 0xc2, 0x40, 0x36, 0x0c, 0x32, 0x99, 0x4b, 0x65, + 0x10, 0x35, 0x13, 0x80, 0x7e, 0xf7, 0x6b, 0xac, 0x05, 0x0b, 0x88, 0x1d, 0x25, 0xba, 0xb3, 0x1a, + 0x12, 0x36, 0x1f, 0xea, 0xe7, 0x5d, 0xe2, 0xd5, 0x23, 0xba, 0xad, 0x73, 0x7c, 0x3f, 0x88, 0xc5, + 0x0e, 0xcd, 0xd8, 0xd6, 0xcd, 0xea, 0x66, 0x6c, 0xe2, 0x50, 0xa6, 0x9e, 0xb3, 0x4e, 0x3c, 0x3e, + 0xa2, 0x82, 0xe9, 0x12, 0x6b, 0xc1, 0x02, 0x62, 0xdf, 0x2a, 0xb0, 0x0d, 0xa4, 0x92, 0x68, 0xe4, + 0x6e, 0x78, 0x1f, 0xc2, 0x84, 0x0a, 0x58, 0xcd, 0x4f, 0x1e, 0x93, 0xde, 0x1e, 0x88, 0xd7, 0x52, + 0x5a, 0x00, 0xe7, 0xca, 0x75, 0x6f, 0x2f, 0xc4, 0x07, 0x8a, 0x30, 0x95, 0x7c, 0xa0, 0x4b, 0x89, + 0xd0, 0x2d, 0xaf, 0xc1, 0x28, 0xed, 0xab, 0x33, 0xf0, 0xb1, 0x89, 0xd7, 0x43, 0x0e, 0x17, 0x8e, + 0x52, 0x0e, 0x9b, 0x6a, 0xa2, 0xb8, 0x8f, 0x9a, 0x78, 0x5c, 0x8d, 0xfa, 0x40, 0x4a, 0xe6, 0x25, + 0x55, 0xe5, 0x19, 0x18, 0x88, 0x62, 0xd2, 0x9a, 0x2c, 0x25, 0xc5, 0x6c, 0x35, 0x26, 0x2d, 0xcc, + 0x20, 0xe8, 0x87, 0x61, 0x3c, 0x76, 0xc2, 0x06, 0x89, 0x43, 0xb2, 0xed, 0x32, 0xbf, 0x2e, 0xdb, + 0xcf, 0x56, 0xe6, 0x8e, 0x53, 0xab, 0x6b, 0x8d, 0x81, 0xb0, 0x04, 0xe1, 0x34, 0xae, 0xfd, 0xdf, + 0x0a, 0xf0, 0x60, 0xf2, 0x13, 0x68, 0xc5, 0xf8, 0x23, 0x09, 0xc5, 0xf8, 0x76, 0x53, 0x31, 0xde, + 0xde, 0x9d, 0x7a, 0xa8, 0xc7, 0x63, 0xdf, 0x31, 0x7a, 0x13, 0x5d, 0x48, 0x7d, 0x84, 0x99, 0x2e, + 0x2f, 0xeb, 0x23, 0x3d, 0xde, 0x31, 0xf5, 0x95, 0x1e, 0x87, 0xc1, 0x90, 0x38, 0x51, 0xe0, 0x8b, + 0xef, 0xa4, 0xbe, 0x26, 0x66, 0xad, 0x58, 0x40, 0xed, 0xaf, 0x55, 0xd2, 0x83, 0x7d, 0x81, 0xfb, + 0xaa, 0x83, 0x10, 0xb9, 0x30, 0xc0, 0x76, 0x6d, 0x5c, 0xb2, 0x5c, 0x3e, 0xdc, 0x2a, 0xa4, 0x5a, + 0x44, 0x91, 0x9e, 0x2b, 0xd3, 0xaf, 0x46, 0x9b, 0x30, 0x63, 0x81, 0x76, 0xa0, 0x5c, 0x93, 0x9b, + 0xa9, 0x42, 0x1e, 0x6e, 0x47, 0xb1, 0x95, 0xd2, 0x1c, 0x47, 0xa8, 0xb8, 0x57, 0x3b, 0x30, 0xc5, + 0x0d, 0x11, 0x28, 0x36, 0xdc, 0x58, 0x7c, 0xd6, 0x43, 0x6e, 0x97, 0x2f, 0xb8, 0xc6, 0x2b, 0x0e, + 0x51, 0x1d, 0x74, 0xc1, 0x8d, 0x31, 0xa5, 0x8f, 0x3e, 0x62, 0xc1, 0x70, 0x54, 0x6b, 0xae, 0x86, + 0xc1, 0xb6, 0x5b, 0x27, 0xa1, 0xb0, 0x31, 0x0f, 0x29, 0xd9, 0xaa, 0xf3, 0xcb, 0x92, 0xa0, 0xe6, + 0xcb, 0xdd, 0x17, 0x1a, 0x82, 0x4d, 0xbe, 0x74, 0xef, 0xf5, 0xa0, 0x78, 0xf7, 0x05, 0x52, 0x63, + 0x2b, 0x4e, 0xee, 0x99, 0xd9, 0x4c, 0x39, 0xb4, 0xcd, 0xbd, 0xd0, 0xae, 0x6d, 0xd1, 0xf5, 0xa6, + 0x3b, 0xf4, 0xd0, 0xad, 0xdd, 0xa9, 0x07, 0xe7, 0xb3, 0x79, 0xe2, 0x5e, 0x9d, 0x61, 0x03, 0xd6, + 0x6a, 0x7b, 0x1e, 0x26, 0xaf, 0xb6, 0x09, 0xf3, 0x88, 0xe5, 0x30, 0x60, 0xab, 0x9a, 0x60, 0x6a, + 0xc0, 0x0c, 0x08, 0x36, 0xf9, 0xa2, 0x57, 0x61, 0xb0, 0xe9, 0xc4, 0xa1, 0xbb, 0x23, 0xdc, 0x60, + 0x87, 0xdc, 0x05, 0x2d, 0x33, 0x5a, 0x9a, 0x39, 0x53, 0xf4, 0xbc, 0x11, 0x0b, 0x46, 0xa8, 0x09, + 0xa5, 0x26, 0x09, 0x1b, 0x64, 0xb2, 0x9c, 0x87, 0xcb, 0x7f, 0x99, 0x92, 0xd2, 0x0c, 0x2b, 0xd4, + 0xb8, 0x62, 0x6d, 0x98, 0x73, 0x41, 0x2f, 0x43, 0x39, 0x22, 0x1e, 0xa9, 0x51, 0xf3, 0xa8, 0xc2, + 0x38, 0x3e, 0xd3, 0xa7, 0xa9, 0x48, 0xed, 0x92, 0xaa, 0x78, 0x94, 0x2f, 0x30, 0xf9, 0x0f, 0x2b, + 0x92, 0x74, 0x00, 0x5b, 0x5e, 0xbb, 0xe1, 0xfa, 0x93, 0x90, 0xc7, 0x00, 0xae, 0x32, 0x5a, 0xa9, + 0x01, 0xe4, 0x8d, 0x58, 0x30, 0xb2, 0xff, 0xab, 0x05, 0x28, 0x29, 0xd4, 0xee, 0x82, 0x4d, 0xfc, + 0x6a, 0xd2, 0x26, 0x5e, 0xca, 0xd3, 0x68, 0xe9, 0x61, 0x16, 0xff, 0x46, 0x05, 0x52, 0xea, 0xe0, + 0x0a, 0x89, 0x62, 0x52, 0x7f, 0x53, 0x84, 0xbf, 0x29, 0xc2, 0xdf, 0x14, 0xe1, 0x4a, 0x84, 0xaf, + 0xa7, 0x44, 0xf8, 0x3b, 0x8d, 0x55, 0xaf, 0x63, 0x0f, 0x5e, 0x51, 0xc1, 0x09, 0x66, 0x0f, 0x0c, + 0x04, 0x2a, 0x09, 0x2e, 0x55, 0x57, 0xae, 0x64, 0xca, 0xec, 0x57, 0x92, 0x32, 0xfb, 0xb0, 0x2c, + 0xfe, 0x3a, 0x48, 0xe9, 0xaf, 0x58, 0xf0, 0xb6, 0xa4, 0xf4, 0x92, 0x33, 0x67, 0xb1, 0xe1, 0x07, + 0x21, 0x59, 0x70, 0x37, 0x36, 0x48, 0x48, 0xfc, 0x1a, 0x89, 0x94, 0x6f, 0xc7, 0xea, 0xe5, 0xdb, + 0x41, 0xcf, 0xc2, 0xc8, 0x8d, 0x28, 0xf0, 0x57, 0x03, 0xd7, 0x17, 0x22, 0x88, 0xee, 0x38, 0x8e, + 0xdd, 0xda, 0x9d, 0x1a, 0xa1, 0x23, 0x2a, 0xdb, 0x71, 0x02, 0x0b, 0xcd, 0xc3, 0xc4, 0x8d, 0x57, + 0x57, 0x9d, 0xd8, 0xf0, 0x26, 0xc8, 0x7d, 0x3f, 0x3b, 0x8f, 0xba, 0xf4, 0x62, 0x0a, 0x88, 0xbb, + 0xf1, 0xed, 0xbf, 0x5d, 0x80, 0x53, 0xa9, 0x17, 0x09, 0x3c, 0x2f, 0x68, 0xc7, 0x74, 0x4f, 0x84, + 0x3e, 0x6f, 0xc1, 0xb1, 0x66, 0xd2, 0x61, 0x11, 0x09, 0x77, 0xf7, 0x8f, 0xe5, 0xa6, 0x23, 0x52, + 0x1e, 0x91, 0xb9, 0x49, 0x31, 0x42, 0xc7, 0x52, 0x80, 0x08, 0x77, 0xf5, 0x05, 0xbd, 0x0c, 0x95, + 0xa6, 0xb3, 0x73, 0xb5, 0x55, 0x77, 0x62, 0xb9, 0x1d, 0xed, 0xed, 0x45, 0x68, 0xc7, 0xae, 0x37, + 0xcd, 0xa3, 0x5a, 0xa6, 0x17, 0xfd, 0x78, 0x25, 0xac, 0xc6, 0xa1, 0xeb, 0x37, 0xb8, 0x93, 0x73, + 0x59, 0x92, 0xc1, 0x9a, 0xa2, 0xfd, 0x39, 0x2b, 0xad, 0xa4, 0xd4, 0xe8, 0x84, 0x4e, 0x4c, 0x1a, + 0x1d, 0xf4, 0x3e, 0x28, 0xd1, 0x7d, 0xa3, 0x1c, 0x95, 0xeb, 0x79, 0x6a, 0x4e, 0xe3, 0x4b, 0x68, + 0x25, 0x4a, 0xff, 0x45, 0x98, 0x33, 0xb5, 0x3f, 0x5f, 0x49, 0x1b, 0x0b, 0xec, 0x6c, 0xfe, 0x2c, + 0x40, 0x23, 0x58, 0x23, 0xcd, 0x96, 0x47, 0x87, 0xc5, 0x62, 0x07, 0x3c, 0xca, 0x55, 0x72, 0x41, + 0x41, 0xb0, 0x81, 0x85, 0x7e, 0xce, 0x02, 0x68, 0xc8, 0x39, 0x2f, 0x0d, 0x81, 0xab, 0x79, 0xbe, + 0x8e, 0x5e, 0x51, 0xba, 0x2f, 0x8a, 0x21, 0x36, 0x98, 0xa3, 0x9f, 0xb6, 0xa0, 0x1c, 0xcb, 0xee, + 0x73, 0xd5, 0xb8, 0x96, 0x67, 0x4f, 0xe4, 0x4b, 0x6b, 0x9b, 0x48, 0x0d, 0x89, 0xe2, 0x8b, 0x7e, + 0xc6, 0x02, 0x88, 0x3a, 0x7e, 0x6d, 0x35, 0xf0, 0xdc, 0x5a, 0x47, 0x68, 0xcc, 0x6b, 0xb9, 0xba, + 0x73, 0x14, 0xf5, 0xb9, 0x31, 0x3a, 0x1a, 0xfa, 0x3f, 0x36, 0x38, 0xa3, 0xf7, 0x43, 0x39, 0x12, + 0xd3, 0x4d, 0xe8, 0xc8, 0xb5, 0x7c, 0x9d, 0x4a, 0x9c, 0xb6, 0x10, 0xaf, 0xe2, 0x1f, 0x56, 0x3c, + 0xd1, 0x67, 0x2c, 0x18, 0x6f, 0x25, 0xdd, 0x84, 0x42, 0x1d, 0xe6, 0x27, 0x03, 0x52, 0x6e, 0x48, + 0xee, 0x6d, 0x49, 0x35, 0xe2, 0x74, 0x2f, 0xa8, 0x04, 0xd4, 0x33, 0x78, 0xa5, 0xc5, 0x5d, 0x96, + 0x43, 0x5a, 0x02, 0x5e, 0x48, 0x03, 0x71, 0x37, 0x3e, 0x5a, 0x85, 0x13, 0xb4, 0x77, 0x1d, 0x6e, + 0x7e, 0x4a, 0xf5, 0x12, 0x31, 0x65, 0x58, 0x9e, 0x7b, 0x58, 0xcc, 0x10, 0x76, 0xd6, 0x91, 0xc6, + 0xc1, 0x99, 0x4f, 0xa2, 0x3f, 0xb0, 0xe0, 0x61, 0x97, 0xa9, 0x01, 0xd3, 0x61, 0xaf, 0x35, 0x82, + 0x38, 0x68, 0x27, 0xb9, 0xca, 0x8a, 0x5e, 0xea, 0x67, 0xee, 0xad, 0xe2, 0x0d, 0x1e, 0x5e, 0xdc, + 0xa3, 0x4b, 0x78, 0xcf, 0x0e, 0xa3, 0x1f, 0x80, 0x51, 0xb9, 0x2e, 0x56, 0xa9, 0x08, 0x66, 0x8a, + 0xb6, 0x32, 0x37, 0x71, 0x6b, 0x77, 0x6a, 0x74, 0xcd, 0x04, 0xe0, 0x24, 0x9e, 0xfd, 0xaf, 0x8a, + 0x89, 0x53, 0x22, 0xe5, 0xc3, 0x64, 0xe2, 0xa6, 0x26, 0xfd, 0x3f, 0x52, 0x7a, 0xe6, 0x2a, 0x6e, + 0x94, 0x77, 0x49, 0x8b, 0x1b, 0xd5, 0x14, 0x61, 0x83, 0x39, 0x35, 0x4a, 0x27, 0x9c, 0xb4, 0xa7, + 0x54, 0x48, 0xc0, 0x97, 0xf3, 0xec, 0x52, 0xf7, 0x99, 0xde, 0x29, 0xd1, 0xb5, 0x89, 0x2e, 0x10, + 0xee, 0xee, 0x12, 0xfa, 0x49, 0xa8, 0x84, 0x2a, 0xb2, 0xa5, 0x98, 0xc7, 0x56, 0x4d, 0x4e, 0x1b, + 0xd1, 0x1d, 0x75, 0x00, 0xa4, 0x63, 0x58, 0x34, 0x47, 0xfb, 0xf7, 0x93, 0x07, 0x63, 0x86, 0xec, + 0xe8, 0xe3, 0xd0, 0xef, 0x93, 0x16, 0x0c, 0x87, 0x81, 0xe7, 0xb9, 0x7e, 0x83, 0xca, 0x39, 0xa1, + 0xac, 0xdf, 0x7d, 0x24, 0xfa, 0x52, 0x08, 0x34, 0x66, 0x59, 0x63, 0xcd, 0x13, 0x9b, 0x1d, 0xb0, + 0xbf, 0x69, 0xc1, 0x64, 0x2f, 0x79, 0x8c, 0x08, 0x3c, 0x24, 0x85, 0x8d, 0x1a, 0x8a, 0x15, 0x7f, + 0x81, 0x78, 0x44, 0xb9, 0xcd, 0xcb, 0x73, 0x8f, 0x89, 0xd7, 0x7c, 0x68, 0xb5, 0x37, 0x2a, 0xde, + 0x8b, 0x0e, 0x7a, 0x09, 0x8e, 0x19, 0xef, 0x15, 0xa9, 0x81, 0xa9, 0xcc, 0x4d, 0x53, 0x03, 0x68, + 0x36, 0x05, 0xbb, 0xbd, 0x3b, 0xf5, 0x40, 0xba, 0x4d, 0x28, 0x8c, 0x2e, 0x3a, 0xf6, 0xaf, 0x14, + 0xd2, 0x5f, 0x4b, 0xe9, 0xfa, 0x37, 0xac, 0x2e, 0x6f, 0xc2, 0x8f, 0x1d, 0x85, 0x7e, 0x65, 0x7e, + 0x07, 0x15, 0x86, 0xd1, 0x1b, 0xe7, 0x1e, 0x1e, 0xdb, 0xdb, 0xff, 0x7a, 0x00, 0xf6, 0xe8, 0x59, + 0x1f, 0xc6, 0xfb, 0x81, 0xcf, 0x51, 0x3f, 0x6e, 0xa9, 0x03, 0x33, 0xbe, 0x86, 0xeb, 0x47, 0x35, + 0xf6, 0x7c, 0xff, 0x14, 0xf1, 0xd0, 0x11, 0xe5, 0x45, 0x4f, 0x1e, 0xcd, 0xa1, 0x2f, 0x58, 0xc9, + 0x23, 0x3f, 0x1e, 0xd4, 0xe8, 0x1e, 0x59, 0x9f, 0x8c, 0x73, 0x44, 0xde, 0x31, 0x7d, 0xfa, 0xd4, + 0xeb, 0x84, 0x71, 0x1a, 0x60, 0xc3, 0xf5, 0x1d, 0xcf, 0x7d, 0x8d, 0xee, 0x8e, 0x4a, 0x4c, 0xc1, + 0x33, 0x8b, 0xe9, 0xbc, 0x6a, 0xc5, 0x06, 0xc6, 0xe9, 0xff, 0x1f, 0x86, 0x8d, 0x37, 0xcf, 0x88, + 0x78, 0x39, 0x61, 0x46, 0xbc, 0x54, 0x8c, 0x40, 0x95, 0xd3, 0xef, 0x84, 0x63, 0xe9, 0x0e, 0x1e, + 0xe4, 0x79, 0xfb, 0x7f, 0x0d, 0xa5, 0xcf, 0xe0, 0xd6, 0x48, 0xd8, 0xa4, 0x5d, 0x7b, 0xd3, 0xb1, + 0xf5, 0xa6, 0x63, 0xeb, 0x4d, 0xc7, 0x96, 0x79, 0x36, 0x21, 0x9c, 0x36, 0x43, 0x77, 0xc9, 0x69, + 0x93, 0x70, 0x43, 0x95, 0x73, 0x77, 0x43, 0xd9, 0x1f, 0xe9, 0xf2, 0xdc, 0xaf, 0x85, 0x84, 0xa0, + 0x00, 0x4a, 0x7e, 0x50, 0x27, 0xd2, 0xc6, 0xbd, 0x94, 0x8f, 0xc1, 0x76, 0x25, 0xa8, 0x1b, 0xe1, + 0xe2, 0xf4, 0x5f, 0x84, 0x39, 0x1f, 0xfb, 0xc3, 0x83, 0x90, 0x30, 0x27, 0xf9, 0x77, 0xff, 0x3e, + 0x18, 0x0a, 0x49, 0x2b, 0xb8, 0x8a, 0x97, 0x84, 0x2e, 0xd3, 0xd9, 0x36, 0xbc, 0x19, 0x4b, 0x38, + 0xd5, 0x79, 0x2d, 0x27, 0xde, 0x14, 0xca, 0x4c, 0xe9, 0xbc, 0x55, 0x27, 0xde, 0xc4, 0x0c, 0x82, + 0xde, 0x09, 0x63, 0x71, 0xe2, 0x28, 0x5c, 0x1c, 0xf9, 0x3e, 0x20, 0x70, 0xc7, 0x92, 0x07, 0xe5, + 0x38, 0x85, 0x8d, 0x5e, 0x85, 0x81, 0x4d, 0xe2, 0x35, 0xc5, 0xa7, 0xaf, 0xe6, 0xa7, 0x6b, 0xd8, + 0xbb, 0x5e, 0x24, 0x5e, 0x93, 0x4b, 0x42, 0xfa, 0x0b, 0x33, 0x56, 0x74, 0xde, 0x57, 0xb6, 0xda, + 0x51, 0x1c, 0x34, 0xdd, 0xd7, 0xa4, 0xa7, 0xf3, 0xc7, 0x72, 0x66, 0x7c, 0x59, 0xd2, 0xe7, 0x2e, + 0x25, 0xf5, 0x17, 0x6b, 0xce, 0xac, 0x1f, 0x75, 0x37, 0x64, 0x53, 0xa6, 0x23, 0x1c, 0x96, 0x79, + 0xf7, 0x63, 0x41, 0xd2, 0xe7, 0xfd, 0x50, 0x7f, 0xb1, 0xe6, 0x8c, 0x3a, 0x6a, 0xfd, 0x0d, 0xb3, + 0x3e, 0x5c, 0xcd, 0xb9, 0x0f, 0x7c, 0xed, 0x65, 0xae, 0xc3, 0xc7, 0xa0, 0x54, 0xdb, 0x74, 0xc2, + 0x78, 0x72, 0x84, 0x4d, 0x1a, 0x35, 0x8b, 0xe7, 0x69, 0x23, 0xe6, 0x30, 0xf4, 0x08, 0x14, 0x43, + 0xb2, 0xc1, 0xa2, 0x93, 0x8d, 0xb8, 0x28, 0x4c, 0x36, 0x30, 0x6d, 0x57, 0x76, 0xd9, 0x58, 0xcf, + 0x80, 0xb9, 0x5f, 0x2a, 0x24, 0x0d, 0xbb, 0xe4, 0xc8, 0xf0, 0xf5, 0x50, 0x6b, 0x87, 0x91, 0x74, + 0x90, 0x19, 0xeb, 0x81, 0x35, 0x63, 0x09, 0x47, 0x1f, 0xb4, 0x60, 0xe8, 0x46, 0x14, 0xf8, 0x3e, + 0x89, 0x85, 0x12, 0xbd, 0x96, 0xf3, 0x60, 0x5d, 0xe2, 0xd4, 0x75, 0x1f, 0x44, 0x03, 0x96, 0x7c, + 0x69, 0x77, 0xc9, 0x4e, 0xcd, 0x6b, 0xd7, 0xbb, 0x82, 0x61, 0xce, 0xf1, 0x66, 0x2c, 0xe1, 0x14, + 0xd5, 0xf5, 0x39, 0xea, 0x40, 0x12, 0x75, 0xd1, 0x17, 0xa8, 0x02, 0x6e, 0xff, 0x5a, 0x19, 0x4e, + 0x66, 0x2e, 0x1f, 0x6a, 0x72, 0x31, 0xa3, 0xe6, 0xbc, 0xeb, 0x11, 0x19, 0x06, 0xc6, 0x4c, 0xae, + 0x6b, 0xaa, 0x15, 0x1b, 0x18, 0xe8, 0xa7, 0x00, 0x5a, 0x4e, 0xe8, 0x34, 0x89, 0x72, 0x60, 0x1f, + 0xda, 0xb2, 0xa1, 0xfd, 0x58, 0x95, 0x34, 0xf5, 0x26, 0x5e, 0x35, 0x45, 0xd8, 0x60, 0x89, 0x9e, + 0x83, 0xe1, 0x90, 0x78, 0xc4, 0x89, 0x58, 0xf8, 0x7b, 0x3a, 0x97, 0x07, 0x6b, 0x10, 0x36, 0xf1, + 0xd0, 0xe3, 0x2a, 0x62, 0x2e, 0x15, 0x39, 0x94, 0x8c, 0x9a, 0x43, 0x9f, 0xb2, 0x60, 0x6c, 0xc3, + 0xf5, 0x88, 0xe6, 0x2e, 0x32, 0x6f, 0x56, 0x0e, 0xff, 0x92, 0xe7, 0x4d, 0xba, 0x5a, 0x86, 0x26, + 0x9a, 0x23, 0x9c, 0x62, 0x4f, 0x3f, 0xf3, 0x36, 0x09, 0x99, 0xf0, 0x1d, 0x4c, 0x7e, 0xe6, 0x6b, + 0xbc, 0x19, 0x4b, 0x38, 0x9a, 0x85, 0xf1, 0x96, 0x13, 0x45, 0xf3, 0x21, 0xa9, 0x13, 0x3f, 0x76, + 0x1d, 0x8f, 0xe7, 0xc5, 0x94, 0x75, 0x38, 0xf9, 0x6a, 0x12, 0x8c, 0xd3, 0xf8, 0xe8, 0x5d, 0xf0, + 0x20, 0xf7, 0x10, 0x2d, 0xbb, 0x51, 0xe4, 0xfa, 0x0d, 0x3d, 0x0d, 0x84, 0xa3, 0x6c, 0x4a, 0x90, + 0x7a, 0x70, 0x31, 0x1b, 0x0d, 0xf7, 0x7a, 0x1e, 0x3d, 0x09, 0xe5, 0x68, 0xcb, 0x6d, 0xcd, 0x87, + 0xf5, 0x88, 0x9d, 0x0e, 0x95, 0xb5, 0x5b, 0xb6, 0x2a, 0xda, 0xb1, 0xc2, 0x40, 0x35, 0x18, 0xe1, + 0x9f, 0x84, 0x87, 0xfc, 0x09, 0x09, 0xfa, 0x54, 0x4f, 0x45, 0x2e, 0x52, 0x60, 0xa7, 0xb1, 0x73, + 0xf3, 0x9c, 0x3c, 0xab, 0xe2, 0x47, 0x2b, 0xd7, 0x0c, 0x32, 0x38, 0x41, 0x34, 0xb9, 0xa7, 0x1b, + 0xee, 0x63, 0x4f, 0xf7, 0x1c, 0x0c, 0x6f, 0xb5, 0xd7, 0x89, 0x18, 0x79, 0x21, 0xd8, 0xd4, 0xec, + 0xbb, 0xac, 0x41, 0xd8, 0xc4, 0x63, 0xd1, 0x96, 0x2d, 0x57, 0xfc, 0x8b, 0x26, 0x47, 0x8d, 0x68, + 0xcb, 0xd5, 0x45, 0xd9, 0x8c, 0x4d, 0x1c, 0xda, 0x35, 0x3a, 0x16, 0x6b, 0x24, 0x62, 0xc9, 0x14, + 0x74, 0xb8, 0x54, 0xd7, 0xaa, 0x12, 0x80, 0x35, 0x0e, 0x5a, 0x85, 0x13, 0xf4, 0x4f, 0x95, 0xa5, + 0x00, 0x5f, 0x73, 0x3c, 0xb7, 0xce, 0x43, 0xff, 0xc6, 0x93, 0xfe, 0xcd, 0x6a, 0x06, 0x0e, 0xce, + 0x7c, 0xd2, 0xfe, 0x6c, 0x21, 0xe9, 0x39, 0x31, 0x45, 0x18, 0x8a, 0xa8, 0xa0, 0x8a, 0xaf, 0x39, + 0xa1, 0x34, 0x78, 0x0e, 0x99, 0xdc, 0x24, 0xe8, 0x5e, 0x73, 0x42, 0x53, 0xe4, 0x31, 0x06, 0x58, + 0x72, 0x42, 0x37, 0x60, 0x20, 0xf6, 0x9c, 0x9c, 0xb2, 0x21, 0x0d, 0x8e, 0xda, 0x91, 0xb5, 0x34, + 0x1b, 0x61, 0xc6, 0x03, 0x3d, 0x4c, 0x77, 0x6f, 0xeb, 0xf2, 0xa4, 0x4d, 0x6c, 0xb8, 0xd6, 0x23, + 0xcc, 0x5a, 0xed, 0x5f, 0x1c, 0xcd, 0xd0, 0x3a, 0xca, 0x10, 0x40, 0x67, 0x01, 0xe8, 0xa4, 0x59, + 0x0d, 0xc9, 0x86, 0xbb, 0x23, 0x0c, 0x31, 0x25, 0xd9, 0xae, 0x28, 0x08, 0x36, 0xb0, 0xe4, 0x33, + 0xd5, 0xf6, 0x06, 0x7d, 0xa6, 0xd0, 0xfd, 0x0c, 0x87, 0x60, 0x03, 0x0b, 0x3d, 0x0b, 0x83, 0x6e, + 0xd3, 0x69, 0xa8, 0x40, 0xe0, 0x87, 0xa9, 0x48, 0x5b, 0x64, 0x2d, 0xb7, 0x77, 0xa7, 0xc6, 0x54, + 0x87, 0x58, 0x13, 0x16, 0xb8, 0xe8, 0x57, 0x2c, 0x18, 0xa9, 0x05, 0xcd, 0x66, 0xe0, 0xf3, 0xed, + 0xb3, 0xf0, 0x05, 0xdc, 0x38, 0x2a, 0x33, 0x69, 0x7a, 0xde, 0x60, 0xc6, 0x9d, 0x01, 0x2a, 0x6d, + 0xd3, 0x04, 0xe1, 0x44, 0xaf, 0x4c, 0xc9, 0x57, 0xda, 0x47, 0xf2, 0xfd, 0xba, 0x05, 0x13, 0xfc, + 0x59, 0x63, 0x57, 0x2f, 0x32, 0x14, 0x83, 0x23, 0x7e, 0xad, 0x2e, 0x47, 0x87, 0x72, 0xf6, 0x76, + 0xc1, 0x71, 0x77, 0x27, 0xd1, 0x05, 0x98, 0xd8, 0x08, 0xc2, 0x1a, 0x31, 0x07, 0x42, 0x88, 0x6d, + 0x45, 0xe8, 0x7c, 0x1a, 0x01, 0x77, 0x3f, 0x83, 0xae, 0xc1, 0x03, 0x46, 0xa3, 0x39, 0x0e, 0x5c, + 0x72, 0x3f, 0x2a, 0xa8, 0x3d, 0x70, 0x3e, 0x13, 0x0b, 0xf7, 0x78, 0x3a, 0x29, 0x24, 0x2b, 0x7d, + 0x08, 0xc9, 0x57, 0xe0, 0x54, 0xad, 0x7b, 0x64, 0xb6, 0xa3, 0xf6, 0x7a, 0xc4, 0xe5, 0x78, 0x79, + 0xee, 0x7b, 0x04, 0x81, 0x53, 0xf3, 0xbd, 0x10, 0x71, 0x6f, 0x1a, 0xe8, 0x7d, 0x50, 0x0e, 0x09, + 0xfb, 0x2a, 0x91, 0x48, 0xd7, 0x3b, 0xa4, 0xb7, 0x43, 0x5b, 0xf0, 0x9c, 0xac, 0xd6, 0x4c, 0xa2, + 0x21, 0xc2, 0x8a, 0x23, 0xba, 0x09, 0x43, 0x2d, 0x27, 0xae, 0x6d, 0x8a, 0x24, 0xbd, 0x43, 0xfb, + 0xe6, 0x15, 0x73, 0x76, 0x94, 0x62, 0x94, 0x3c, 0xe0, 0x4c, 0xb0, 0xe4, 0x46, 0x6d, 0xb5, 0x5a, + 0xd0, 0x6c, 0x05, 0x3e, 0xf1, 0x63, 0xa9, 0x44, 0xc6, 0xf8, 0x79, 0x87, 0x6c, 0xc5, 0x06, 0x46, + 0x97, 0x2e, 0xd7, 0x68, 0x93, 0x13, 0x7b, 0xe8, 0x72, 0x83, 0x5a, 0xaf, 0xe7, 0xa9, 0xb2, 0x61, + 0x6e, 0xc5, 0xeb, 0x6e, 0xbc, 0x19, 0xb4, 0x63, 0xb9, 0x4b, 0x16, 0x8a, 0x4a, 0x29, 0x9b, 0xa5, + 0x0c, 0x1c, 0x9c, 0xf9, 0x64, 0x5a, 0xb3, 0x8e, 0xdf, 0x99, 0x66, 0x3d, 0xd6, 0x87, 0x66, 0xad, + 0xc2, 0x49, 0xd6, 0x03, 0x61, 0x25, 0x4b, 0xa7, 0x65, 0x34, 0x89, 0x58, 0xe7, 0x55, 0x7e, 0xcb, + 0x52, 0x16, 0x12, 0xce, 0x7e, 0xf6, 0xf4, 0x8f, 0xc0, 0x44, 0x97, 0x90, 0x3b, 0x90, 0x43, 0x72, + 0x01, 0x1e, 0xc8, 0x16, 0x27, 0x07, 0x72, 0x4b, 0xfe, 0x5a, 0x2a, 0x2e, 0xdd, 0xd8, 0xa2, 0xf5, + 0xe1, 0xe2, 0x76, 0xa0, 0x48, 0xfc, 0x6d, 0xa1, 0x5d, 0xcf, 0x1f, 0x6e, 0x56, 0x9f, 0xf3, 0xb7, + 0xb9, 0x34, 0x64, 0x7e, 0xbc, 0x73, 0xfe, 0x36, 0xa6, 0xb4, 0xd1, 0x2f, 0x58, 0x89, 0x0d, 0x04, + 0x77, 0x8c, 0xbf, 0xe7, 0x48, 0xf6, 0xa4, 0x7d, 0xef, 0x29, 0xec, 0x7f, 0x53, 0x80, 0x33, 0xfb, + 0x11, 0xe9, 0x63, 0xf8, 0x1e, 0x83, 0xc1, 0x88, 0x45, 0x9a, 0x08, 0x75, 0x35, 0x4c, 0x57, 0x31, + 0x8f, 0x3d, 0x79, 0x05, 0x0b, 0x10, 0xf2, 0xa0, 0xd8, 0x74, 0x5a, 0xc2, 0x5f, 0xba, 0x78, 0xd8, + 0xfc, 0x3d, 0xfa, 0xdf, 0xf1, 0x96, 0x9d, 0x16, 0x9f, 0xf3, 0x46, 0x03, 0xa6, 0x6c, 0x50, 0x0c, + 0x25, 0x27, 0x0c, 0x1d, 0x19, 0xd6, 0x70, 0x39, 0x1f, 0x7e, 0xb3, 0x94, 0x24, 0x3f, 0x15, 0x4e, + 0x34, 0x61, 0xce, 0xcc, 0xfe, 0x4c, 0x39, 0x91, 0xec, 0xc5, 0x62, 0x55, 0x22, 0x18, 0x14, 0x6e, + 0x52, 0x2b, 0xef, 0xb4, 0x49, 0x9e, 0x4d, 0xcd, 0x3c, 0x10, 0xa2, 0x26, 0x85, 0x60, 0x85, 0x3e, + 0x66, 0xb1, 0xca, 0x0f, 0x32, 0x83, 0x4e, 0xec, 0xea, 0x8f, 0xa6, 0x10, 0x85, 0x59, 0x4f, 0x42, + 0x36, 0x62, 0x93, 0xbb, 0xa8, 0x6e, 0xc3, 0x76, 0x33, 0xdd, 0xd5, 0x6d, 0xd8, 0xee, 0x44, 0xc2, + 0xd1, 0x4e, 0x46, 0x4c, 0x4a, 0x0e, 0xd5, 0x03, 0xfa, 0x88, 0x42, 0xf9, 0x82, 0x05, 0x13, 0x6e, + 0x3a, 0xb8, 0x40, 0xec, 0x81, 0xaf, 0xe7, 0xe3, 0xd3, 0xec, 0x8e, 0x5d, 0x50, 0x86, 0x4e, 0x17, + 0x08, 0x77, 0x77, 0x06, 0xd5, 0x61, 0xc0, 0xf5, 0x37, 0x02, 0x61, 0xde, 0xcd, 0x1d, 0xae, 0x53, + 0x8b, 0xfe, 0x46, 0xa0, 0x57, 0x33, 0xfd, 0x87, 0x19, 0x75, 0xb4, 0x04, 0x27, 0x64, 0xbe, 0xcf, + 0x45, 0x37, 0x8a, 0x83, 0xb0, 0xb3, 0xe4, 0x36, 0xdd, 0x98, 0x99, 0x66, 0xc5, 0xb9, 0x49, 0xaa, + 0xde, 0x70, 0x06, 0x1c, 0x67, 0x3e, 0x85, 0x5e, 0x83, 0x21, 0x79, 0xa0, 0x5f, 0xce, 0xc3, 0x9f, + 0xd0, 0x3d, 0xff, 0xd5, 0x64, 0xaa, 0x8a, 0x13, 0x7d, 0xc9, 0x10, 0x7d, 0xd4, 0x82, 0x31, 0xfe, + 0xfb, 0x62, 0xa7, 0xce, 0x53, 0x0c, 0x2b, 0x79, 0x44, 0xed, 0x57, 0x13, 0x34, 0xe7, 0xd0, 0xad, + 0xdd, 0xa9, 0xb1, 0x64, 0x1b, 0x4e, 0xf1, 0xb5, 0xff, 0xe1, 0x08, 0x74, 0x87, 0x40, 0x24, 0xe3, + 0x1d, 0xac, 0xbb, 0x1d, 0xef, 0x40, 0x77, 0x95, 0x91, 0x0e, 0x55, 0xc8, 0x61, 0x99, 0x09, 0xae, + 0xfa, 0x18, 0xba, 0xe3, 0xd7, 0x30, 0xe3, 0x81, 0xda, 0x30, 0xc8, 0x8b, 0x4b, 0x09, 0x0d, 0x70, + 0xf8, 0x93, 0x6f, 0xb3, 0x48, 0x95, 0x76, 0x6b, 0xf1, 0x56, 0x2c, 0x98, 0xa1, 0x1d, 0x18, 0xda, + 0xe4, 0xd3, 0x51, 0xec, 0xf5, 0x96, 0x0f, 0x3b, 0xbe, 0x89, 0x39, 0xae, 0x27, 0x9f, 0x68, 0xc0, + 0x92, 0x1d, 0x0b, 0xaf, 0x33, 0x02, 0x80, 0xb8, 0x20, 0xc9, 0x2f, 0x5b, 0xb2, 0xff, 0xe8, 0x9f, + 0xf7, 0xc2, 0x48, 0x48, 0x6a, 0x81, 0x5f, 0x73, 0x3d, 0x52, 0x9f, 0x95, 0x07, 0x62, 0x07, 0x49, + 0x92, 0x63, 0xde, 0x24, 0x6c, 0xd0, 0xc0, 0x09, 0x8a, 0x6c, 0x9d, 0xa9, 0xc4, 0x79, 0xfa, 0x41, + 0x88, 0x38, 0xf8, 0x58, 0xca, 0x29, 0x4d, 0x9f, 0xd1, 0xe4, 0xeb, 0x2c, 0xd9, 0x86, 0x53, 0x7c, + 0xd1, 0x4b, 0x00, 0xc1, 0x3a, 0x8f, 0xa1, 0x9b, 0x8d, 0xc5, 0x29, 0xc8, 0x41, 0x5e, 0x75, 0x8c, + 0x27, 0xdb, 0x4a, 0x0a, 0xd8, 0xa0, 0x86, 0x2e, 0x03, 0xf0, 0x95, 0xb3, 0xd6, 0x69, 0xc9, 0x0d, + 0xa1, 0xcc, 0x72, 0x84, 0xaa, 0x82, 0xdc, 0xde, 0x9d, 0xea, 0xf6, 0x39, 0xb3, 0x40, 0x21, 0xe3, + 0x71, 0xf4, 0x13, 0x30, 0x14, 0xb5, 0x9b, 0x4d, 0x47, 0x9d, 0x91, 0xe4, 0x98, 0xbe, 0xcb, 0xe9, + 0x1a, 0x82, 0x91, 0x37, 0x60, 0xc9, 0x11, 0xdd, 0xa0, 0x22, 0x5e, 0x48, 0x28, 0xbe, 0x8a, 0xb8, + 0x85, 0xc2, 0x3d, 0x81, 0xef, 0x90, 0xbb, 0x18, 0x9c, 0x81, 0x73, 0x7b, 0x77, 0xea, 0x81, 0x64, + 0xfb, 0x52, 0x20, 0x12, 0x6a, 0x33, 0x69, 0xa2, 0x4b, 0xb2, 0x8e, 0x16, 0x7d, 0x6d, 0x59, 0xde, + 0xe5, 0x09, 0x5d, 0x47, 0x8b, 0x35, 0xf7, 0x1e, 0x33, 0xf3, 0x61, 0xb4, 0x0c, 0xc7, 0x6b, 0x81, + 0x1f, 0x87, 0x81, 0xe7, 0xf1, 0x1a, 0x7b, 0x7c, 0x6f, 0xce, 0xcf, 0x50, 0x1e, 0x12, 0xdd, 0x3e, + 0x3e, 0xdf, 0x8d, 0x82, 0xb3, 0x9e, 0xa3, 0x36, 0x79, 0x5a, 0x3f, 0x8c, 0xe5, 0x72, 0xbc, 0x9e, + 0xa0, 0x29, 0x24, 0x94, 0x72, 0x7b, 0xef, 0xa3, 0x29, 0xfc, 0xe4, 0x21, 0xab, 0xf8, 0x62, 0xcf, + 0xc2, 0x08, 0xd9, 0x89, 0x49, 0xe8, 0x3b, 0xde, 0x55, 0xbc, 0x24, 0x0f, 0x2c, 0xd8, 0xc2, 0x3c, + 0x67, 0xb4, 0xe3, 0x04, 0x16, 0xb2, 0x95, 0x97, 0xcc, 0xc8, 0x5c, 0xe7, 0x5e, 0x32, 0xe9, 0x13, + 0xb3, 0xbf, 0x54, 0x4c, 0xd8, 0xac, 0xf7, 0xe4, 0x48, 0x97, 0x95, 0x48, 0x92, 0xb5, 0xa4, 0x18, + 0x40, 0xec, 0xc5, 0xf2, 0xe4, 0xac, 0x4a, 0x24, 0xad, 0x98, 0x8c, 0x70, 0x92, 0x2f, 0xda, 0x82, + 0xd2, 0x66, 0x10, 0xc5, 0x72, 0x87, 0x76, 0xc8, 0xcd, 0xe0, 0xc5, 0x20, 0x8a, 0x99, 0xa1, 0xa5, + 0x5e, 0x9b, 0xb6, 0x44, 0x98, 0xf3, 0xa0, 0x7b, 0xff, 0x68, 0xd3, 0x09, 0xeb, 0xd1, 0x3c, 0xab, + 0x33, 0x31, 0xc0, 0x2c, 0x2c, 0x65, 0x4f, 0x57, 0x35, 0x08, 0x9b, 0x78, 0xf6, 0x9f, 0x59, 0x89, + 0x53, 0xad, 0xeb, 0x2c, 0x69, 0x60, 0x9b, 0xf8, 0x54, 0x44, 0x99, 0x61, 0x8a, 0x3f, 0x90, 0x4a, + 0xc1, 0x7e, 0x5b, 0xaf, 0x72, 0x98, 0x37, 0x29, 0x85, 0x69, 0x46, 0xc2, 0x88, 0x68, 0xfc, 0x80, + 0x95, 0xcc, 0xa5, 0x2f, 0xe4, 0xb1, 0x75, 0x33, 0xeb, 0x49, 0xec, 0x9b, 0x96, 0x6f, 0xff, 0x82, + 0x05, 0x43, 0x73, 0x4e, 0x6d, 0x2b, 0xd8, 0xd8, 0x40, 0x4f, 0x42, 0xb9, 0xde, 0x0e, 0xcd, 0xb4, + 0x7e, 0xe5, 0xac, 0x5a, 0x10, 0xed, 0x58, 0x61, 0xd0, 0xa9, 0xbf, 0xe1, 0xd4, 0x64, 0x55, 0x89, + 0x22, 0x9f, 0xfa, 0xe7, 0x59, 0x0b, 0x16, 0x10, 0x3a, 0xfc, 0x4d, 0x67, 0x47, 0x3e, 0x9c, 0x3e, + 0x52, 0x5b, 0xd6, 0x20, 0x6c, 0xe2, 0xd9, 0xff, 0xd2, 0x82, 0xc9, 0x39, 0x27, 0x72, 0x6b, 0xb3, + 0xed, 0x78, 0x73, 0xce, 0x8d, 0xd7, 0xdb, 0xb5, 0x2d, 0x12, 0xf3, 0xea, 0x23, 0xb4, 0x97, 0xed, + 0x88, 0xae, 0x40, 0xb5, 0x63, 0x56, 0xbd, 0xbc, 0x2a, 0xda, 0xb1, 0xc2, 0x40, 0xaf, 0xc1, 0x70, + 0xcb, 0x89, 0xa2, 0x9b, 0x41, 0x58, 0xc7, 0x64, 0x23, 0x9f, 0xfa, 0x44, 0x55, 0x52, 0x0b, 0x49, + 0x8c, 0xc9, 0x86, 0x08, 0x50, 0xd1, 0xf4, 0xb1, 0xc9, 0xcc, 0xfe, 0x39, 0x0b, 0x4e, 0xcc, 0x11, + 0x27, 0x24, 0x21, 0x2b, 0x67, 0xa4, 0x5e, 0x04, 0xbd, 0x0a, 0xe5, 0x98, 0xb6, 0xd0, 0x1e, 0x59, + 0xf9, 0xf6, 0x88, 0x85, 0x96, 0xac, 0x09, 0xe2, 0x58, 0xb1, 0xb1, 0x3f, 0x69, 0xc1, 0xa9, 0xac, + 0xbe, 0xcc, 0x7b, 0x41, 0xbb, 0x7e, 0x2f, 0x3a, 0xf4, 0xb7, 0x2c, 0x18, 0x61, 0xc7, 0xf5, 0x0b, + 0x24, 0x76, 0x5c, 0xaf, 0xab, 0x94, 0xa2, 0xd5, 0x67, 0x29, 0xc5, 0x33, 0x30, 0xb0, 0x19, 0x34, + 0x49, 0x3a, 0xd4, 0xe4, 0x62, 0xd0, 0x24, 0x98, 0x41, 0xd0, 0xd3, 0x74, 0x12, 0xba, 0x7e, 0xec, + 0xd0, 0xe5, 0x28, 0x8f, 0x33, 0xc6, 0xf9, 0x04, 0x54, 0xcd, 0xd8, 0xc4, 0xb1, 0x7f, 0xbb, 0x02, + 0x43, 0x22, 0x2e, 0xaa, 0xef, 0x6a, 0x38, 0xd2, 0x8b, 0x53, 0xe8, 0xe9, 0xc5, 0x89, 0x60, 0xb0, + 0xc6, 0xea, 0xdd, 0x0a, 0x0b, 0xfd, 0x72, 0x2e, 0x81, 0x74, 0xbc, 0x84, 0xae, 0xee, 0x16, 0xff, + 0x8f, 0x05, 0x2b, 0xf4, 0xba, 0x05, 0xe3, 0xb5, 0xc0, 0xf7, 0x49, 0x4d, 0xdb, 0x8e, 0x03, 0x79, + 0x6c, 0x10, 0xe6, 0x93, 0x44, 0xf5, 0x49, 0x70, 0x0a, 0x80, 0xd3, 0xec, 0xd1, 0x0b, 0x30, 0xca, + 0xc7, 0xec, 0x5a, 0xe2, 0x0c, 0x46, 0x57, 0xd8, 0x33, 0x81, 0x38, 0x89, 0x8b, 0xa6, 0xf9, 0x59, + 0x96, 0xa8, 0x65, 0x37, 0xa8, 0x5d, 0xd5, 0x46, 0x15, 0x3b, 0x03, 0x03, 0x85, 0x80, 0x42, 0xb2, + 0x11, 0x92, 0x68, 0x53, 0xc4, 0x8d, 0x31, 0xbb, 0x75, 0xe8, 0xce, 0xea, 0x58, 0xe0, 0x2e, 0x4a, + 0x38, 0x83, 0x3a, 0xda, 0x12, 0x6e, 0x84, 0x72, 0x1e, 0xf2, 0x5c, 0x7c, 0xe6, 0x9e, 0xde, 0x84, + 0x29, 0x28, 0x31, 0xd5, 0xc5, 0xec, 0xe5, 0x22, 0xcf, 0x9d, 0x64, 0x8a, 0x0d, 0xf3, 0x76, 0xb4, + 0x00, 0xc7, 0x52, 0xf5, 0x01, 0x23, 0x71, 0x56, 0xa2, 0xf2, 0xe4, 0x52, 0x95, 0x05, 0x23, 0xdc, + 0xf5, 0x84, 0xe9, 0x62, 0x1a, 0xde, 0xc7, 0xc5, 0xd4, 0x51, 0xd1, 0xc9, 0xfc, 0x14, 0xe3, 0xc5, + 0x5c, 0x06, 0xa0, 0xaf, 0x50, 0xe4, 0x4f, 0xa4, 0x42, 0x91, 0x47, 0x59, 0x07, 0xae, 0xe5, 0xd3, + 0x81, 0x83, 0xc7, 0x1d, 0xdf, 0xcb, 0x38, 0xe2, 0xff, 0x69, 0x81, 0xfc, 0xae, 0xf3, 0x4e, 0x6d, + 0x93, 0xd0, 0x29, 0x83, 0xde, 0x09, 0x63, 0xca, 0x3b, 0xc1, 0x4d, 0x22, 0x8b, 0xcd, 0x1a, 0x65, + 0x3b, 0xe3, 0x04, 0x14, 0xa7, 0xb0, 0xd1, 0x0c, 0x54, 0xe8, 0x38, 0xf1, 0x47, 0xb9, 0xde, 0x57, + 0x1e, 0x90, 0xd9, 0xd5, 0x45, 0xf1, 0x94, 0xc6, 0x41, 0x01, 0x4c, 0x78, 0x4e, 0x14, 0xb3, 0x1e, + 0x54, 0x3b, 0x7e, 0xed, 0x0e, 0xab, 0xc8, 0xb0, 0x64, 0xac, 0xa5, 0x34, 0x21, 0xdc, 0x4d, 0xdb, + 0xfe, 0x77, 0x25, 0x18, 0x4d, 0x48, 0xc6, 0x03, 0x1a, 0x0c, 0x4f, 0x42, 0x59, 0xea, 0xf0, 0x74, + 0xb9, 0x2c, 0xa5, 0xe8, 0x15, 0x06, 0x55, 0x5a, 0xeb, 0x5a, 0xab, 0xa6, 0x0d, 0x1c, 0x43, 0xe1, + 0x62, 0x13, 0x8f, 0x09, 0xe5, 0xd8, 0x8b, 0xe6, 0x3d, 0x97, 0xf8, 0x31, 0xef, 0x66, 0x3e, 0x42, + 0x79, 0x6d, 0xa9, 0x6a, 0x12, 0xd5, 0x42, 0x39, 0x05, 0xc0, 0x69, 0xf6, 0xe8, 0xc3, 0x16, 0x8c, + 0x3a, 0x37, 0x23, 0x5d, 0x94, 0x5d, 0x04, 0x1d, 0x1f, 0x52, 0x49, 0x25, 0xea, 0xbc, 0x73, 0xc7, + 0x7e, 0xa2, 0x09, 0x27, 0x99, 0xa2, 0x37, 0x2c, 0x40, 0x64, 0x87, 0xd4, 0x64, 0x58, 0xb4, 0xe8, + 0xcb, 0x60, 0x1e, 0x3b, 0xf8, 0x73, 0x5d, 0x74, 0xb9, 0x54, 0xef, 0x6e, 0xc7, 0x19, 0x7d, 0x40, + 0x97, 0x00, 0xd5, 0xdd, 0xc8, 0x59, 0xf7, 0xc8, 0x7c, 0xd0, 0x94, 0x09, 0xc4, 0xe2, 0x3c, 0xfd, + 0xb4, 0x18, 0x67, 0xb4, 0xd0, 0x85, 0x81, 0x33, 0x9e, 0x62, 0xb3, 0x2c, 0x0c, 0x76, 0x3a, 0x57, + 0x43, 0x8f, 0x69, 0x09, 0x73, 0x96, 0x89, 0x76, 0xac, 0x30, 0xec, 0x3f, 0x2f, 0xaa, 0xa5, 0xac, + 0x73, 0x00, 0x1c, 0x23, 0x16, 0xd9, 0xba, 0xf3, 0x58, 0x64, 0x1d, 0x29, 0xd5, 0x9d, 0x16, 0x9f, + 0xc8, 0xa2, 0x2d, 0xdc, 0xa3, 0x2c, 0xda, 0x9f, 0xb6, 0x12, 0x25, 0xe9, 0x86, 0xcf, 0xbe, 0x94, + 0x6f, 0xfe, 0xc1, 0x34, 0x8f, 0xe2, 0x4a, 0xe9, 0x95, 0x54, 0xf0, 0xde, 0x93, 0x50, 0xde, 0xf0, + 0x1c, 0x56, 0x48, 0x85, 0x2d, 0x54, 0x23, 0xc2, 0xec, 0xbc, 0x68, 0xc7, 0x0a, 0x83, 0x4a, 0x7d, + 0x83, 0xe8, 0x81, 0xa4, 0xf6, 0x7f, 0x2c, 0xc2, 0xb0, 0xa1, 0xf1, 0x33, 0xcd, 0x37, 0xeb, 0x3e, + 0x33, 0xdf, 0x0a, 0x07, 0x30, 0xdf, 0x7e, 0x0a, 0x2a, 0x35, 0xa9, 0x8d, 0xf2, 0x29, 0xb1, 0x9f, + 0xd6, 0x71, 0x5a, 0x21, 0xa9, 0x26, 0xac, 0x79, 0xa2, 0x0b, 0x89, 0x4c, 0xcd, 0x84, 0x5f, 0x20, + 0x2b, 0x95, 0x52, 0x68, 0xb4, 0xee, 0x67, 0xd2, 0xf1, 0x01, 0xa5, 0xfd, 0xe3, 0x03, 0xec, 0x6f, + 0x58, 0xea, 0xe3, 0xde, 0x85, 0x92, 0x3c, 0x37, 0x92, 0x25, 0x79, 0xce, 0xe5, 0x32, 0xcc, 0x3d, + 0x6a, 0xf1, 0x5c, 0x81, 0xa1, 0xf9, 0xa0, 0xd9, 0x74, 0xfc, 0x3a, 0xfa, 0x5e, 0x18, 0xaa, 0xf1, + 0x9f, 0xc2, 0x87, 0xc6, 0x0e, 0xab, 0x05, 0x14, 0x4b, 0x18, 0x7a, 0x18, 0x06, 0x9c, 0xb0, 0x21, + 0xfd, 0x66, 0x2c, 0x08, 0x6e, 0x36, 0x6c, 0x44, 0x98, 0xb5, 0xda, 0x7f, 0x69, 0xc1, 0x18, 0x7d, + 0xc4, 0x65, 0x2f, 0xc5, 0x5e, 0xe7, 0x71, 0x18, 0x74, 0xda, 0xf1, 0x66, 0xd0, 0xb5, 0x0f, 0x9b, + 0x65, 0xad, 0x58, 0x40, 0xe9, 0x3e, 0x4c, 0xd5, 0x72, 0x30, 0xf6, 0x61, 0x0b, 0x74, 0x2e, 0x33, + 0x08, 0x35, 0x65, 0xa3, 0xf6, 0x7a, 0xd6, 0x69, 0x69, 0x95, 0x37, 0x63, 0x09, 0xa7, 0xc4, 0xd6, + 0x83, 0x7a, 0x47, 0x84, 0xf6, 0x2a, 0x62, 0x73, 0x41, 0xbd, 0x83, 0x19, 0x04, 0x3d, 0x02, 0xc5, + 0x68, 0xd3, 0x91, 0xe7, 0xf2, 0x32, 0xca, 0xbc, 0x7a, 0x71, 0x16, 0xd3, 0x76, 0x95, 0x34, 0x11, + 0x7a, 0xe9, 0x18, 0xdb, 0x64, 0xd2, 0x44, 0xe8, 0xd9, 0xff, 0x6c, 0x00, 0x58, 0xbc, 0x8d, 0x13, + 0x92, 0xfa, 0x5a, 0xc0, 0xaa, 0x01, 0x1f, 0xe9, 0xb1, 0xb6, 0xde, 0xc8, 0xde, 0xcf, 0x47, 0xdb, + 0xc6, 0xf1, 0x66, 0xf1, 0x6e, 0x1f, 0x6f, 0x66, 0x9f, 0x58, 0x0f, 0xdc, 0x47, 0x27, 0xd6, 0xf6, + 0xc7, 0x2d, 0x40, 0x2a, 0x7a, 0x4a, 0x87, 0x94, 0xcc, 0x40, 0x45, 0x85, 0x6b, 0x89, 0xf5, 0xa2, + 0xc5, 0xa2, 0x04, 0x60, 0x8d, 0xd3, 0x87, 0xf7, 0xe2, 0x31, 0xa9, 0xb3, 0x8a, 0xc9, 0x9c, 0x0b, + 0xa6, 0xe9, 0x84, 0x0a, 0xb3, 0x7f, 0xa7, 0x00, 0x0f, 0x70, 0x73, 0x69, 0xd9, 0xf1, 0x9d, 0x06, + 0x69, 0xd2, 0x5e, 0xf5, 0x1b, 0x24, 0x54, 0xa3, 0xdb, 0x66, 0x57, 0x66, 0x48, 0x1c, 0x56, 0x5e, + 0x71, 0x39, 0xc3, 0x25, 0xcb, 0xa2, 0xef, 0xc6, 0x98, 0x11, 0x47, 0x11, 0x94, 0xe5, 0x7d, 0x44, + 0x42, 0xff, 0xe4, 0xc4, 0x48, 0x89, 0x62, 0x61, 0x59, 0x10, 0xac, 0x18, 0x51, 0xf3, 0xc1, 0x0b, + 0x6a, 0x5b, 0x74, 0xc9, 0xa7, 0xcd, 0x87, 0x25, 0xd1, 0x8e, 0x15, 0x86, 0xdd, 0x84, 0x71, 0x39, + 0x86, 0xad, 0xcb, 0xa4, 0x83, 0xc9, 0x06, 0xd5, 0xb9, 0x35, 0xd9, 0x64, 0x5c, 0x91, 0xa4, 0x74, + 0xee, 0xbc, 0x09, 0xc4, 0x49, 0x5c, 0x59, 0x20, 0xb8, 0x90, 0x5d, 0x20, 0xd8, 0xfe, 0x1d, 0x0b, + 0xd2, 0x4a, 0xdf, 0x28, 0x87, 0x6a, 0xed, 0x59, 0x0e, 0xf5, 0x00, 0x05, 0x45, 0x7f, 0x1c, 0x86, + 0x9d, 0x98, 0x5a, 0x75, 0xdc, 0x03, 0x53, 0xbc, 0xb3, 0x93, 0xc3, 0xe5, 0xa0, 0xee, 0x6e, 0xb8, + 0xcc, 0xf3, 0x62, 0x92, 0xb3, 0xdf, 0xb0, 0xa0, 0xb2, 0x10, 0x76, 0x0e, 0x9e, 0xaa, 0xd6, 0x9d, + 0x88, 0x56, 0x38, 0x50, 0x22, 0x9a, 0x4c, 0x75, 0x2b, 0xf6, 0x4a, 0x75, 0xb3, 0xff, 0x6a, 0x00, + 0x26, 0xba, 0x72, 0x2f, 0xd1, 0xf3, 0x30, 0xa2, 0xbe, 0x92, 0x74, 0xbb, 0x56, 0xcc, 0xe0, 0x65, + 0x0d, 0xc3, 0x09, 0xcc, 0x3e, 0x96, 0xea, 0x22, 0x1c, 0x0f, 0xc9, 0xab, 0x6d, 0xd2, 0x26, 0xb3, + 0x1b, 0x31, 0x09, 0xab, 0xa4, 0x16, 0xf8, 0x75, 0x5e, 0x4f, 0xb8, 0x38, 0xf7, 0xe0, 0xad, 0xdd, + 0xa9, 0xe3, 0xb8, 0x1b, 0x8c, 0xb3, 0x9e, 0x41, 0x2d, 0x18, 0xf5, 0xcc, 0xfd, 0x82, 0xd8, 0xa6, + 0xde, 0xd1, 0x56, 0x43, 0xcd, 0xd6, 0x44, 0x33, 0x4e, 0x32, 0x48, 0x6e, 0x3a, 0x4a, 0xf7, 0x68, + 0xd3, 0xf1, 0x21, 0xbd, 0xe9, 0xe0, 0xb1, 0x40, 0xef, 0xce, 0x39, 0xf7, 0xb6, 0x9f, 0x5d, 0xc7, + 0x61, 0xf6, 0x11, 0x2f, 0x42, 0x59, 0xc6, 0x49, 0xf6, 0x15, 0x5f, 0x68, 0xd2, 0xe9, 0x21, 0xdb, + 0x1f, 0x87, 0xb7, 0x9e, 0x0b, 0x43, 0x63, 0x30, 0xaf, 0x04, 0xf1, 0xac, 0xe7, 0x05, 0x37, 0xa9, + 0xb9, 0x72, 0x35, 0x22, 0xc2, 0x0f, 0x68, 0xdf, 0x2e, 0x40, 0xc6, 0x96, 0x9a, 0xae, 0x49, 0x6d, + 0x17, 0x26, 0xd6, 0xe4, 0xc1, 0x6c, 0x43, 0xb4, 0xc3, 0x63, 0x49, 0xb9, 0x35, 0xf0, 0xae, 0xbc, + 0x5d, 0x02, 0x3a, 0xbc, 0x54, 0x49, 0x4a, 0x15, 0x62, 0x7a, 0x16, 0x40, 0x9b, 0xf3, 0xc2, 0x26, + 0x54, 0xc1, 0x21, 0xda, 0xea, 0xc7, 0x06, 0x16, 0x7a, 0x0e, 0x86, 0x5d, 0x3f, 0x8a, 0x1d, 0xcf, + 0xbb, 0xe8, 0xfa, 0xb1, 0xb0, 0x13, 0x95, 0xd9, 0xb3, 0xa8, 0x41, 0xd8, 0xc4, 0x3b, 0xfd, 0x0e, + 0xe3, 0xfb, 0x1d, 0xe4, 0xbb, 0x6f, 0xc2, 0xa9, 0x0b, 0x6e, 0xac, 0x92, 0x14, 0xd5, 0x7c, 0xa3, + 0xd6, 0xba, 0x92, 0x55, 0x56, 0xcf, 0xb4, 0x5c, 0x23, 0x49, 0xb0, 0x90, 0xcc, 0x69, 0x4c, 0x27, + 0x09, 0xda, 0x35, 0x38, 0x71, 0xc1, 0x8d, 0xcf, 0xbb, 0x1e, 0x39, 0x42, 0x26, 0x5f, 0x1e, 0x84, + 0x11, 0x33, 0x77, 0xff, 0x20, 0x92, 0xfd, 0x93, 0xd4, 0x8e, 0x15, 0x03, 0xe1, 0xaa, 0x03, 0xef, + 0xeb, 0x87, 0x2e, 0x24, 0x90, 0x3d, 0xb8, 0x86, 0x29, 0xab, 0x79, 0x62, 0xb3, 0x03, 0xe8, 0x26, + 0x94, 0x36, 0x58, 0xbe, 0x5b, 0x31, 0x8f, 0x50, 0xa5, 0xac, 0xc1, 0xd7, 0x2b, 0x97, 0x67, 0xcc, + 0x71, 0x7e, 0xd4, 0xfc, 0x08, 0x93, 0x69, 0xd6, 0x46, 0x16, 0x82, 0xd0, 0x6b, 0x0a, 0xa3, 0x97, + 0xf6, 0x28, 0xdd, 0x81, 0xf6, 0x48, 0xc8, 0xf2, 0xc1, 0x7b, 0x24, 0xcb, 0x59, 0xee, 0x62, 0xbc, + 0xc9, 0x8c, 0x63, 0x91, 0x36, 0x35, 0xc4, 0x06, 0xc1, 0xc8, 0x5d, 0x4c, 0x80, 0x71, 0x1a, 0x1f, + 0xbd, 0x5f, 0x69, 0x83, 0x72, 0x1e, 0x07, 0x0a, 0xe6, 0x8c, 0x3e, 0x6a, 0x45, 0xf0, 0xf1, 0x02, + 0x8c, 0x5d, 0xf0, 0xdb, 0xab, 0x17, 0x56, 0xdb, 0xeb, 0x9e, 0x5b, 0xbb, 0x4c, 0x3a, 0x54, 0xda, + 0x6f, 0x91, 0xce, 0xe2, 0x82, 0x58, 0x41, 0x6a, 0xce, 0x5c, 0xa6, 0x8d, 0x98, 0xc3, 0xa8, 0xdc, + 0xda, 0x70, 0xfd, 0x06, 0x09, 0x5b, 0xa1, 0x2b, 0x7c, 0xfd, 0x86, 0xdc, 0x3a, 0xaf, 0x41, 0xd8, + 0xc4, 0xa3, 0xb4, 0x83, 0x9b, 0x3e, 0x09, 0xd3, 0xbb, 0x84, 0x15, 0xda, 0x88, 0x39, 0x8c, 0x22, + 0xc5, 0x61, 0x5b, 0xb8, 0xd2, 0x0c, 0xa4, 0x35, 0xda, 0x88, 0x39, 0x4c, 0xec, 0xd2, 0x59, 0x24, + 0x58, 0xa9, 0x6b, 0x97, 0xce, 0x82, 0x28, 0x24, 0x9c, 0xa2, 0x6e, 0x91, 0xce, 0x82, 0x13, 0x3b, + 0xe9, 0x4d, 0xf6, 0x65, 0xde, 0x8c, 0x25, 0x9c, 0x15, 0x47, 0x4e, 0x0e, 0xc7, 0x77, 0x5c, 0x71, + 0xe4, 0x64, 0xf7, 0x7b, 0x38, 0x64, 0xfe, 0x66, 0x01, 0x46, 0xde, 0xbc, 0xc1, 0x34, 0xe3, 0x6e, + 0x9e, 0xeb, 0x30, 0xd1, 0x95, 0x31, 0xdd, 0x87, 0x85, 0xb4, 0x6f, 0x45, 0x0b, 0x1b, 0xc3, 0x30, + 0x25, 0x2c, 0x8b, 0x02, 0xce, 0xc3, 0x04, 0x5f, 0xbc, 0x94, 0x13, 0x4b, 0x80, 0x55, 0x59, 0xf0, + 0xec, 0x30, 0xeb, 0x5a, 0x1a, 0x88, 0xbb, 0xf1, 0xed, 0x4f, 0x58, 0x30, 0x9a, 0x48, 0x62, 0xcf, + 0xc9, 0x96, 0x63, 0xab, 0x3b, 0x60, 0x51, 0xcc, 0x2c, 0xab, 0xa4, 0xc8, 0xd4, 0xb0, 0x5e, 0xdd, + 0x1a, 0x84, 0x4d, 0x3c, 0xfb, 0xf7, 0x8a, 0x50, 0x96, 0x11, 0x57, 0x7d, 0x74, 0xe5, 0x63, 0x16, + 0x8c, 0xaa, 0x03, 0x44, 0xe6, 0xf1, 0x2d, 0xe4, 0x91, 0x53, 0x47, 0x7b, 0xa0, 0xfc, 0x27, 0xfe, + 0x46, 0xa0, 0x37, 0x16, 0xd8, 0x64, 0x86, 0x93, 0xbc, 0xd1, 0x35, 0x80, 0xa8, 0x13, 0xc5, 0xa4, + 0x69, 0xf8, 0x9e, 0x6d, 0x63, 0x96, 0x4d, 0xd7, 0x82, 0x90, 0xd0, 0x39, 0x75, 0x25, 0xa8, 0x93, + 0xaa, 0xc2, 0xd4, 0x16, 0x9e, 0x6e, 0xc3, 0x06, 0x25, 0xf4, 0x9a, 0x3a, 0xee, 0x1e, 0xc8, 0x43, + 0xaf, 0xcb, 0xf1, 0xed, 0xe7, 0xbc, 0xfb, 0x10, 0xe7, 0xcb, 0xf6, 0xaf, 0x16, 0xe0, 0x58, 0x7a, + 0x24, 0xd1, 0xbb, 0x61, 0x44, 0x0e, 0x9a, 0xe1, 0x66, 0x90, 0x61, 0x6e, 0x23, 0xd8, 0x80, 0xdd, + 0xde, 0x9d, 0x9a, 0xea, 0xbe, 0x0a, 0x7b, 0xda, 0x44, 0xc1, 0x09, 0x62, 0xfc, 0xf0, 0x59, 0x44, + 0x49, 0xcc, 0x75, 0x66, 0x5b, 0x2d, 0x71, 0x82, 0x6c, 0x1c, 0x3e, 0x9b, 0x50, 0x9c, 0xc2, 0x46, + 0xab, 0x70, 0xc2, 0x68, 0xb9, 0x42, 0xdc, 0xc6, 0xe6, 0x7a, 0x10, 0xca, 0x7d, 0xed, 0xc3, 0x3a, + 0xa8, 0xb6, 0x1b, 0x07, 0x67, 0x3e, 0x49, 0x0d, 0xa3, 0x9a, 0xd3, 0x72, 0x6a, 0x6e, 0xdc, 0x11, + 0x67, 0x00, 0x4a, 0x8c, 0xcf, 0x8b, 0x76, 0xac, 0x30, 0xec, 0xbf, 0x37, 0x00, 0xc7, 0x78, 0x14, + 0x29, 0x51, 0x41, 0xd2, 0xe8, 0xdd, 0x50, 0x89, 0x62, 0x27, 0xe4, 0x4e, 0x0d, 0xeb, 0xc0, 0xa2, + 0x4b, 0x67, 0xde, 0x4b, 0x22, 0x58, 0xd3, 0x43, 0x2f, 0xb1, 0xb2, 0x65, 0x6e, 0xb4, 0xc9, 0xa8, + 0x17, 0xee, 0xcc, 0x65, 0x72, 0x5e, 0x51, 0xc0, 0x06, 0x35, 0xf4, 0x43, 0x50, 0x6a, 0x6d, 0x3a, + 0x91, 0xf4, 0xe7, 0x3d, 0x2e, 0xe5, 0xc4, 0x2a, 0x6d, 0xbc, 0xbd, 0x3b, 0x75, 0x32, 0xfd, 0xaa, + 0x0c, 0x80, 0xf9, 0x43, 0xa6, 0x94, 0x1f, 0xd8, 0xff, 0x6a, 0x9d, 0x7a, 0xd8, 0xa9, 0x5e, 0x9c, + 0x4d, 0x5f, 0xc6, 0xb2, 0xc0, 0x5a, 0xb1, 0x80, 0x52, 0x99, 0xb4, 0xc9, 0x59, 0xd6, 0x29, 0xf2, + 0x60, 0xd2, 0xe2, 0xb8, 0xa8, 0x41, 0xd8, 0xc4, 0x43, 0x1f, 0xef, 0x8e, 0x31, 0x1e, 0x3a, 0x82, + 0x1c, 0x94, 0x7e, 0xa3, 0x8b, 0xcf, 0x41, 0x45, 0x74, 0x75, 0x2d, 0x40, 0xcf, 0xc3, 0x08, 0x77, + 0x17, 0xcd, 0x85, 0x8e, 0x5f, 0xdb, 0x4c, 0x3b, 0x79, 0xd6, 0x0c, 0x18, 0x4e, 0x60, 0xda, 0xcb, + 0x30, 0xd0, 0xa7, 0x90, 0xed, 0x6b, 0xef, 0xfe, 0x22, 0x94, 0x29, 0x39, 0xb9, 0x41, 0xcb, 0x83, + 0x64, 0x00, 0x65, 0x79, 0x51, 0x23, 0xb2, 0xa1, 0xe8, 0x3a, 0x32, 0x96, 0x44, 0x2d, 0xa1, 0xc5, + 0x28, 0x6a, 0xb3, 0x69, 0x47, 0x81, 0xe8, 0x31, 0x28, 0x92, 0x9d, 0x56, 0x3a, 0x68, 0xe4, 0xdc, + 0x4e, 0xcb, 0x0d, 0x49, 0x44, 0x91, 0xc8, 0x4e, 0x0b, 0x9d, 0x86, 0x82, 0x5b, 0x17, 0x33, 0x12, + 0x04, 0x4e, 0x61, 0x71, 0x01, 0x17, 0xdc, 0xba, 0xbd, 0x03, 0x15, 0x75, 0x33, 0x24, 0xda, 0x92, + 0x26, 0x95, 0x95, 0x47, 0x14, 0xb1, 0xa4, 0xdb, 0xc3, 0x98, 0x6a, 0x03, 0xe8, 0x92, 0x0e, 0x79, + 0xa9, 0xe0, 0x33, 0x30, 0x50, 0x0b, 0x44, 0x31, 0x9e, 0xb2, 0x26, 0xc3, 0x6c, 0x29, 0x06, 0xb1, + 0xaf, 0xc3, 0xd8, 0x65, 0x3f, 0xb8, 0xc9, 0x2e, 0x70, 0x62, 0xf5, 0x8a, 0x29, 0xe1, 0x0d, 0xfa, + 0x23, 0x6d, 0xb9, 0x33, 0x28, 0xe6, 0x30, 0x55, 0x49, 0xb5, 0xd0, 0xab, 0x92, 0xaa, 0xfd, 0x01, + 0x0b, 0x46, 0x54, 0x6e, 0xf8, 0x85, 0xed, 0x2d, 0x4a, 0xb7, 0x11, 0x06, 0xed, 0x56, 0x9a, 0x2e, + 0xbb, 0x84, 0x16, 0x73, 0x98, 0x59, 0x34, 0xa1, 0xb0, 0x4f, 0xd1, 0x84, 0x33, 0x30, 0xb0, 0xe5, + 0xfa, 0xf5, 0xb4, 0x53, 0xf4, 0xb2, 0xeb, 0xd7, 0x31, 0x83, 0xd8, 0xff, 0xc2, 0x82, 0x63, 0xaa, + 0x0b, 0xd2, 0x66, 0x7a, 0x1e, 0x46, 0xd6, 0xdb, 0xae, 0x57, 0x97, 0x85, 0x98, 0x53, 0xcb, 0x65, + 0xce, 0x80, 0xe1, 0x04, 0x26, 0x3a, 0x0b, 0xb0, 0xee, 0xfa, 0x4e, 0xd8, 0x59, 0xd5, 0x46, 0x9a, + 0xd2, 0xdb, 0x73, 0x0a, 0x82, 0x0d, 0x2c, 0xca, 0x2d, 0x22, 0xb1, 0x4e, 0x72, 0xe0, 0x1f, 0x42, + 0x71, 0xab, 0x1a, 0x30, 0x9c, 0xc0, 0xb4, 0x3f, 0x55, 0x84, 0xb1, 0x64, 0x6e, 0x7d, 0x1f, 0x5e, + 0x8f, 0xc7, 0xa0, 0xc4, 0xd2, 0xed, 0xd3, 0x93, 0x82, 0x57, 0x3d, 0xe6, 0x30, 0x14, 0xc1, 0x20, + 0x17, 0x03, 0xf9, 0x5c, 0x01, 0xaa, 0x3a, 0xa9, 0x7c, 0xb0, 0x2c, 0x4a, 0x5b, 0xb8, 0xb4, 0x05, + 0x2b, 0xf4, 0x61, 0x0b, 0x86, 0x82, 0x96, 0x59, 0xbb, 0xf3, 0x5d, 0x79, 0xd6, 0x1d, 0x10, 0xc9, + 0xbd, 0xc2, 0x92, 0x51, 0x93, 0x46, 0x7e, 0x48, 0xc9, 0xfa, 0xf4, 0x0f, 0xc2, 0x88, 0x89, 0xb9, + 0x9f, 0x31, 0x53, 0x36, 0x8d, 0x99, 0x8f, 0x99, 0xd3, 0x49, 0x54, 0x56, 0xe8, 0x63, 0xa1, 0x5e, + 0x85, 0x52, 0x4d, 0x85, 0xb2, 0xdd, 0x51, 0xe1, 0x7f, 0x55, 0x79, 0x8c, 0x85, 0x09, 0x70, 0x6a, + 0xf6, 0x37, 0x2c, 0x63, 0x7e, 0x60, 0x12, 0x2d, 0xd6, 0x51, 0x08, 0xc5, 0xc6, 0xf6, 0x96, 0x30, + 0x10, 0x2e, 0xe5, 0x34, 0xbc, 0x17, 0xb6, 0xb7, 0xf4, 0x7c, 0x35, 0x5b, 0x31, 0x65, 0xd6, 0xc7, + 0x41, 0x41, 0xa2, 0x00, 0x47, 0x71, 0xff, 0x02, 0x1c, 0xf6, 0x1b, 0x05, 0x98, 0xe8, 0x9a, 0x54, + 0xe8, 0x35, 0x28, 0x85, 0xf4, 0x2d, 0xc5, 0xeb, 0x2d, 0xe5, 0x56, 0x32, 0x23, 0x5a, 0xac, 0x6b, + 0xc5, 0x9b, 0x6c, 0xc7, 0x9c, 0x25, 0xba, 0x04, 0x48, 0x07, 0x5c, 0xaa, 0x53, 0x0a, 0xfe, 0xca, + 0x2a, 0x2a, 0x6b, 0xb6, 0x0b, 0x03, 0x67, 0x3c, 0x85, 0x5e, 0x48, 0x1f, 0x76, 0x14, 0x93, 0xa7, + 0x6c, 0x7b, 0x9d, 0x5b, 0xd8, 0xbf, 0x59, 0x80, 0xd1, 0x44, 0x29, 0x55, 0xe4, 0x41, 0x99, 0x78, + 0xec, 0x08, 0x54, 0xaa, 0xa9, 0xc3, 0x5e, 0x8c, 0xa2, 0x54, 0xeb, 0x39, 0x41, 0x17, 0x2b, 0x0e, + 0xf7, 0x47, 0xb0, 0xd6, 0xf3, 0x30, 0x22, 0x3b, 0xf4, 0x2e, 0xa7, 0xe9, 0x89, 0x01, 0x54, 0x73, + 0xf4, 0x9c, 0x01, 0xc3, 0x09, 0x4c, 0xfb, 0x77, 0x8b, 0x30, 0xc9, 0xcf, 0x8c, 0xeb, 0x6a, 0xe6, + 0xa9, 0xd8, 0x8f, 0x9f, 0xd7, 0x05, 0x8f, 0xad, 0x3c, 0x6e, 0xff, 0xee, 0xc5, 0xa8, 0xaf, 0x18, + 0xe3, 0xcf, 0xa7, 0x62, 0x8c, 0xf9, 0x9e, 0xb6, 0x71, 0x44, 0x3d, 0xfa, 0xce, 0x0a, 0x3a, 0xfe, + 0x47, 0x05, 0x18, 0x4f, 0x5d, 0xf2, 0x86, 0x3e, 0x95, 0xbc, 0x17, 0xc4, 0xca, 0xe3, 0x3c, 0x6d, + 0xcf, 0x7b, 0xbf, 0x0e, 0x76, 0x3b, 0xc8, 0x3d, 0x5a, 0x2a, 0xf6, 0xd7, 0x0b, 0x30, 0x96, 0xbc, + 0x9d, 0xee, 0x3e, 0x1c, 0xa9, 0xb7, 0x43, 0x85, 0x5d, 0xc0, 0x74, 0x99, 0x74, 0xe4, 0x71, 0x1c, + 0xbf, 0xeb, 0x46, 0x36, 0x62, 0x0d, 0xbf, 0x2f, 0x2e, 0x5d, 0xb1, 0xff, 0x89, 0x05, 0x27, 0xf9, + 0x5b, 0xa6, 0xe7, 0xe1, 0xdf, 0xc8, 0x1a, 0xdd, 0x97, 0xf3, 0xed, 0x60, 0xaa, 0x50, 0xf7, 0x7e, + 0xe3, 0xcb, 0xee, 0x40, 0x17, 0xbd, 0x4d, 0x4e, 0x85, 0xfb, 0xb0, 0xb3, 0x07, 0x9a, 0x0c, 0xf6, + 0xbf, 0x2f, 0xc0, 0xf0, 0xca, 0xfc, 0xa2, 0x12, 0xe1, 0x33, 0x50, 0xa9, 0x85, 0xc4, 0xd1, 0x7e, + 0x12, 0x33, 0x22, 0x49, 0x02, 0xb0, 0xc6, 0xa1, 0xdb, 0x0d, 0x1e, 0xd1, 0x17, 0xa5, 0xb7, 0x1b, + 0x3c, 0xe0, 0x2f, 0xc2, 0x12, 0x8e, 0x9e, 0x84, 0x32, 0xcb, 0xb5, 0xbd, 0x1a, 0x4a, 0x8d, 0xa3, + 0xf7, 0xa0, 0xac, 0x1d, 0x2f, 0x61, 0x85, 0x41, 0x09, 0xd7, 0x83, 0x5a, 0x44, 0x91, 0x53, 0xae, + 0x8b, 0x05, 0xda, 0x8c, 0x97, 0xb0, 0x84, 0xb3, 0x52, 0x89, 0x6c, 0x7b, 0x4f, 0x91, 0x4b, 0xc9, + 0x4e, 0x73, 0x3f, 0x00, 0x45, 0xd7, 0x38, 0x07, 0x29, 0xa9, 0x99, 0xca, 0x77, 0x1b, 0xea, 0x2f, + 0xdf, 0xcd, 0xfe, 0x7a, 0x11, 0xf4, 0x75, 0xfa, 0xc8, 0x15, 0x05, 0x26, 0x72, 0x29, 0x04, 0x5f, + 0xed, 0xf8, 0x35, 0x7d, 0x71, 0x7f, 0x39, 0x55, 0x5f, 0xe2, 0x67, 0x2d, 0x18, 0x76, 0x7d, 0x37, + 0x76, 0x1d, 0xe6, 0x44, 0xcb, 0xe7, 0x4e, 0x6c, 0xc5, 0x6e, 0x91, 0x53, 0x0e, 0x42, 0xf3, 0x6c, + 0x5c, 0x31, 0xc3, 0x26, 0x67, 0xf4, 0x5e, 0x91, 0x5e, 0x55, 0xcc, 0xad, 0x4a, 0x4b, 0x39, 0x95, + 0x53, 0xd5, 0xa2, 0x06, 0x6d, 0x1c, 0xe6, 0x54, 0xdc, 0x08, 0x53, 0x52, 0xea, 0x4e, 0x11, 0xb5, + 0x65, 0x60, 0xcd, 0x98, 0x33, 0xb2, 0x23, 0x40, 0xdd, 0x63, 0x71, 0xc0, 0xd4, 0x95, 0x19, 0xa8, + 0x38, 0xed, 0x38, 0x68, 0xd2, 0x61, 0x12, 0x27, 0xeb, 0x3a, 0x39, 0x47, 0x02, 0xb0, 0xc6, 0xb1, + 0x3f, 0x55, 0x82, 0x54, 0xb9, 0x07, 0xb4, 0x03, 0x15, 0x55, 0xf0, 0x21, 0x9f, 0x54, 0x50, 0x3d, + 0xa3, 0x54, 0x67, 0x54, 0x13, 0xd6, 0xcc, 0x50, 0x43, 0xfa, 0x23, 0xf9, 0x6a, 0x7f, 0x31, 0xed, + 0x8f, 0xfc, 0xd1, 0xfe, 0x8e, 0xa7, 0xe8, 0x5c, 0x9d, 0xe1, 0x05, 0xfe, 0xa6, 0xf7, 0x75, 0x5d, + 0xee, 0x77, 0x2b, 0xf8, 0x07, 0xc5, 0x0d, 0x5e, 0x98, 0x44, 0x6d, 0x2f, 0x16, 0xb3, 0xe1, 0xc5, + 0x1c, 0x57, 0x19, 0x27, 0xac, 0xcb, 0x26, 0xf1, 0xff, 0xd8, 0x60, 0x9a, 0x74, 0x30, 0x0f, 0x1e, + 0xa9, 0x83, 0x79, 0x28, 0x57, 0x07, 0xf3, 0x59, 0x00, 0x36, 0xb7, 0x79, 0x88, 0x7d, 0x99, 0xf9, + 0xfd, 0x94, 0x8a, 0xc1, 0x0a, 0x82, 0x0d, 0x2c, 0xfb, 0xfb, 0x21, 0x59, 0xf7, 0x0b, 0x4d, 0xc9, + 0x32, 0x63, 0xfc, 0xe8, 0x8c, 0x65, 0x37, 0x26, 0x2a, 0x82, 0xfd, 0xba, 0x05, 0x66, 0x71, 0x32, + 0xf4, 0x2a, 0xaf, 0x82, 0x66, 0xe5, 0x71, 0x14, 0x63, 0xd0, 0x9d, 0x5e, 0x76, 0x5a, 0xa9, 0xb0, + 0x20, 0x59, 0x0a, 0xed, 0xf4, 0x3b, 0xa0, 0x2c, 0xa1, 0x07, 0x32, 0x96, 0xdf, 0x0f, 0xc7, 0x65, + 0xa5, 0x04, 0x79, 0x6a, 0x22, 0x8e, 0xe7, 0xf7, 0x77, 0xc6, 0x49, 0x0f, 0x5b, 0xa1, 0x97, 0x87, + 0x4d, 0xed, 0xfe, 0x8b, 0x3d, 0xeb, 0x9b, 0xff, 0x86, 0x05, 0x67, 0xd2, 0x1d, 0x88, 0x96, 0x03, + 0xdf, 0x8d, 0x83, 0xb0, 0x4a, 0xe2, 0xd8, 0xf5, 0x1b, 0xac, 0x58, 0xed, 0x4d, 0x27, 0x94, 0x17, + 0x16, 0x31, 0x41, 0x79, 0xdd, 0x09, 0x7d, 0xcc, 0x5a, 0x51, 0x07, 0x06, 0x79, 0x4c, 0xb2, 0xd8, + 0x05, 0x1d, 0x72, 0x6d, 0x64, 0x0c, 0x87, 0xde, 0x86, 0xf1, 0x78, 0x68, 0x2c, 0x18, 0xda, 0xdf, + 0xb2, 0x00, 0xad, 0x6c, 0x93, 0x30, 0x74, 0xeb, 0x46, 0x14, 0x35, 0xbb, 0x09, 0xd3, 0xb8, 0xf1, + 0xd2, 0xac, 0xe3, 0x91, 0xba, 0x09, 0xd3, 0xf8, 0x97, 0x7d, 0x13, 0x66, 0xe1, 0x60, 0x37, 0x61, + 0xa2, 0x15, 0x38, 0xd9, 0xe4, 0xdb, 0x38, 0x7e, 0xbb, 0x1c, 0xdf, 0xd3, 0xa9, 0x94, 0xf3, 0x53, + 0xb7, 0x76, 0xa7, 0x4e, 0x2e, 0x67, 0x21, 0xe0, 0xec, 0xe7, 0xec, 0x77, 0x00, 0xe2, 0xc1, 0xd3, + 0xf3, 0x59, 0xf1, 0x9f, 0x3d, 0xdd, 0x5a, 0xf6, 0xe7, 0x4a, 0x30, 0x9e, 0xba, 0xce, 0x82, 0x6e, + 0xa1, 0xbb, 0x03, 0x4e, 0x0f, 0xad, 0xbf, 0xbb, 0xbb, 0xd7, 0x57, 0x08, 0xab, 0x0f, 0x25, 0xd7, + 0x6f, 0xb5, 0xe3, 0x7c, 0x2a, 0x5e, 0xf0, 0x4e, 0x2c, 0x52, 0x82, 0x86, 0x03, 0x9f, 0xfe, 0xc5, + 0x9c, 0x4d, 0x9e, 0x01, 0xb1, 0x89, 0x4d, 0xce, 0xc0, 0x3d, 0x72, 0xb3, 0x7c, 0x50, 0x87, 0xa7, + 0x96, 0xf2, 0x70, 0xd8, 0xa6, 0x26, 0xcb, 0x51, 0xc7, 0x24, 0x7d, 0xa9, 0x00, 0xc3, 0xc6, 0x47, + 0x43, 0xbf, 0x94, 0x2c, 0xdd, 0x69, 0xe5, 0xf7, 0x4a, 0x8c, 0xfe, 0xb4, 0x2e, 0xce, 0xc9, 0x5f, + 0xe9, 0xf1, 0xee, 0xaa, 0x9d, 0xb7, 0x77, 0xa7, 0x8e, 0xa5, 0xea, 0x72, 0x26, 0x2a, 0x79, 0x9e, + 0xfe, 0x49, 0x18, 0x4f, 0x91, 0xc9, 0x78, 0xe5, 0x35, 0xf3, 0x95, 0x0f, 0xed, 0xee, 0x33, 0x87, + 0xec, 0x8b, 0x74, 0xc8, 0x44, 0xa2, 0x7d, 0xe0, 0x91, 0x3e, 0x7c, 0xdb, 0xa9, 0xfd, 0x45, 0xa1, + 0xcf, 0x7a, 0x1a, 0x4f, 0x40, 0xb9, 0x15, 0x78, 0x6e, 0xcd, 0x55, 0x95, 0xbf, 0x59, 0x05, 0x8f, + 0x55, 0xd1, 0x86, 0x15, 0x14, 0xdd, 0x84, 0xca, 0x8d, 0x9b, 0x31, 0x3f, 0x8f, 0x13, 0xe7, 0x06, + 0x79, 0x1d, 0xc3, 0x29, 0xa3, 0x45, 0x1d, 0xf8, 0x61, 0xcd, 0x0b, 0xd9, 0x30, 0xc8, 0x94, 0xa0, + 0x4c, 0xba, 0x63, 0x67, 0x1a, 0x4c, 0x3b, 0x46, 0x58, 0x40, 0xec, 0x7f, 0x3b, 0x0c, 0x27, 0xb2, + 0xee, 0x14, 0x42, 0xef, 0x83, 0x41, 0xde, 0xc7, 0x7c, 0xae, 0xad, 0xcb, 0xe2, 0x71, 0x81, 0x11, + 0x14, 0xdd, 0x62, 0xbf, 0xb1, 0xe0, 0x29, 0xb8, 0x7b, 0xce, 0xba, 0x98, 0x21, 0x47, 0xc3, 0x7d, + 0xc9, 0xd1, 0xdc, 0x97, 0x1c, 0xce, 0xdd, 0x73, 0xd6, 0xd1, 0x0e, 0x94, 0x1a, 0x6e, 0x4c, 0x1c, + 0xe1, 0x9c, 0xb9, 0x7e, 0x24, 0xcc, 0x89, 0xc3, 0xad, 0x34, 0xf6, 0x13, 0x73, 0x86, 0xe8, 0x0b, + 0x16, 0x8c, 0xaf, 0x27, 0x0b, 0xf9, 0x08, 0xe1, 0xe9, 0x1c, 0xc1, 0xbd, 0x51, 0x49, 0x46, 0xfc, + 0x2a, 0xd8, 0x54, 0x23, 0x4e, 0x77, 0x07, 0x7d, 0xc8, 0x82, 0xa1, 0x0d, 0xd7, 0x33, 0x2e, 0xe6, + 0x38, 0x82, 0x8f, 0x73, 0x9e, 0x31, 0xd0, 0x3b, 0x0e, 0xfe, 0x3f, 0xc2, 0x92, 0x73, 0x2f, 0x4d, + 0x35, 0x78, 0x58, 0x4d, 0x35, 0x74, 0x8f, 0x34, 0xd5, 0x47, 0x2d, 0xa8, 0xa8, 0x91, 0x16, 0x05, + 0x51, 0xde, 0x7d, 0x84, 0x9f, 0x9c, 0x7b, 0xa4, 0xd4, 0x5f, 0xac, 0x99, 0xa3, 0xd7, 0x2d, 0x18, + 0x76, 0x5e, 0x6b, 0x87, 0xa4, 0x4e, 0xb6, 0x83, 0x56, 0x24, 0x2a, 0x95, 0xbe, 0x9c, 0x7f, 0x67, + 0x66, 0x29, 0x93, 0x05, 0xb2, 0xbd, 0xd2, 0x8a, 0x44, 0x42, 0xb0, 0x6e, 0xc0, 0x66, 0x17, 0xd0, + 0xcf, 0x68, 0x3d, 0x0e, 0x79, 0xd4, 0xab, 0xce, 0xea, 0x4d, 0x5f, 0xf9, 0xed, 0x04, 0x1e, 0xaa, + 0x05, 0x7e, 0xec, 0xfa, 0x6d, 0xb2, 0xe2, 0x63, 0xd2, 0x0a, 0xae, 0x04, 0xf1, 0xf9, 0xa0, 0xed, + 0xd7, 0xcf, 0x85, 0x61, 0x10, 0xb2, 0x8a, 0x2f, 0xc6, 0x6d, 0xa5, 0xf3, 0xbd, 0x51, 0xf1, 0x5e, + 0x74, 0x0e, 0x63, 0x33, 0xec, 0x16, 0x60, 0x6a, 0x9f, 0xc1, 0x46, 0xcf, 0xc3, 0x48, 0x10, 0x36, + 0x1c, 0xdf, 0x7d, 0xcd, 0x2c, 0x62, 0xa6, 0x0c, 0xd2, 0x15, 0x03, 0x86, 0x13, 0x98, 0x66, 0x75, + 0x9b, 0xc2, 0x3e, 0xd5, 0x6d, 0xce, 0xc0, 0x40, 0x48, 0x5a, 0x41, 0x7a, 0x5f, 0xc5, 0x72, 0xf8, + 0x18, 0x04, 0x3d, 0x02, 0x45, 0xa7, 0xe5, 0x0a, 0xe7, 0xa2, 0xda, 0x2e, 0xce, 0xae, 0x2e, 0x62, + 0xda, 0x9e, 0x28, 0xb6, 0x55, 0xba, 0x2b, 0xc5, 0xb6, 0xa8, 0xc6, 0x14, 0xc7, 0x67, 0x83, 0x5a, + 0x63, 0x26, 0x8f, 0xb5, 0xec, 0x37, 0x8a, 0xf0, 0xc8, 0x9e, 0x4b, 0x4b, 0xc7, 0x76, 0x5b, 0x7b, + 0xc4, 0x76, 0xcb, 0xe1, 0x29, 0xec, 0x37, 0x3c, 0xc5, 0x1e, 0xc3, 0xf3, 0x21, 0x2a, 0x31, 0x64, + 0xf1, 0xb7, 0x7c, 0x2e, 0x4d, 0xef, 0x55, 0x4b, 0x4e, 0x08, 0x0b, 0x09, 0xc5, 0x9a, 0x2f, 0xdd, + 0x2e, 0x25, 0x2a, 0xbb, 0x94, 0xf2, 0xd0, 0x98, 0x3d, 0x0b, 0xb0, 0x71, 0x31, 0xd1, 0xab, 0x5c, + 0x8c, 0xfd, 0x5b, 0x03, 0xf0, 0x58, 0x1f, 0x8a, 0xce, 0x9c, 0xc5, 0x56, 0x9f, 0xb3, 0xf8, 0x3b, + 0xfc, 0x33, 0x7d, 0x24, 0xf3, 0x33, 0xe1, 0xfc, 0x3f, 0xd3, 0xde, 0x5f, 0x88, 0x9d, 0x40, 0xf8, + 0x11, 0xa9, 0xb5, 0x43, 0x9e, 0xe7, 0x62, 0x24, 0xf8, 0x2e, 0x8a, 0x76, 0xac, 0x30, 0xe8, 0xf6, + 0xb7, 0xe6, 0xd0, 0xe5, 0x3f, 0x94, 0x53, 0x25, 0x0f, 0x33, 0x57, 0x98, 0x5b, 0x5f, 0xf3, 0xb3, + 0x54, 0x02, 0x70, 0x36, 0xf6, 0x2f, 0x5a, 0x70, 0xba, 0xb7, 0x35, 0x82, 0x9e, 0x86, 0xe1, 0x75, + 0x16, 0x75, 0xb8, 0xcc, 0xe2, 0x93, 0xc4, 0xd4, 0x61, 0xef, 0xab, 0x9b, 0xb1, 0x89, 0x83, 0xe6, + 0x61, 0xc2, 0x0c, 0x57, 0x5c, 0x36, 0x02, 0x9b, 0x98, 0xbf, 0x64, 0x2d, 0x0d, 0xc4, 0xdd, 0xf8, + 0xf6, 0xb7, 0x8b, 0xd9, 0xdd, 0xe2, 0x56, 0xeb, 0x41, 0x66, 0xb3, 0x98, 0xab, 0x85, 0x3e, 0x24, + 0x6e, 0xf1, 0x6e, 0x4b, 0xdc, 0x81, 0x5e, 0x12, 0x17, 0x2d, 0xc0, 0x31, 0xe3, 0x3e, 0x53, 0x5e, + 0xdb, 0x85, 0x1f, 0x32, 0xa9, 0xc2, 0x6c, 0xab, 0x29, 0x38, 0xee, 0x7a, 0xe2, 0x3e, 0x9f, 0x7a, + 0x5f, 0x29, 0xc0, 0xa9, 0x9e, 0x1b, 0x85, 0xbb, 0xa4, 0x51, 0xcc, 0xcf, 0x3f, 0x70, 0x77, 0x3e, + 0xbf, 0xf9, 0x51, 0x4a, 0xfb, 0x7e, 0x94, 0x7e, 0xd4, 0xf3, 0x1f, 0x15, 0x7a, 0x2e, 0x16, 0xba, + 0xb1, 0xfc, 0xae, 0x1d, 0xc9, 0x17, 0x60, 0xd4, 0x69, 0xb5, 0x38, 0x1e, 0x4b, 0x49, 0x48, 0x15, + 0x8b, 0x9c, 0x35, 0x81, 0x38, 0x89, 0xdb, 0xd7, 0xc0, 0xfe, 0xa9, 0x05, 0x15, 0x4c, 0x36, 0xb8, + 0xc4, 0x42, 0x37, 0xc4, 0x10, 0x59, 0x79, 0x54, 0xec, 0xa7, 0x03, 0x1b, 0xb9, 0xac, 0x8c, 0x7d, + 0xd6, 0x60, 0x1f, 0xb6, 0xf4, 0x80, 0xba, 0x05, 0xb5, 0xd8, 0xfb, 0x16, 0x54, 0xfb, 0xcb, 0x15, + 0xfa, 0x7a, 0xad, 0x60, 0x3e, 0x24, 0xf5, 0x88, 0x7e, 0xdf, 0x76, 0xe8, 0x89, 0x49, 0xa2, 0xbe, + 0xef, 0x55, 0xbc, 0x84, 0x69, 0x7b, 0xe2, 0xbc, 0xb1, 0x70, 0xa0, 0x52, 0x79, 0xc5, 0x7d, 0x4b, + 0xe5, 0xbd, 0x00, 0xa3, 0x51, 0xb4, 0xb9, 0x1a, 0xba, 0xdb, 0x4e, 0x4c, 0x2e, 0x13, 0x59, 0x53, + 0x47, 0x97, 0x8d, 0xaa, 0x5e, 0xd4, 0x40, 0x9c, 0xc4, 0x45, 0x17, 0x60, 0x42, 0x17, 0xac, 0x23, + 0x61, 0xcc, 0x72, 0xfd, 0xf8, 0x4c, 0x50, 0xf5, 0x52, 0x74, 0x89, 0x3b, 0x81, 0x80, 0xbb, 0x9f, + 0xa1, 0x32, 0x37, 0xd1, 0x48, 0x3b, 0x32, 0x98, 0x94, 0xb9, 0x09, 0x3a, 0xb4, 0x2f, 0x5d, 0x4f, + 0xa0, 0x65, 0x38, 0xce, 0x27, 0xc6, 0x6c, 0xab, 0x65, 0xbc, 0xd1, 0x50, 0xb2, 0x4c, 0xfa, 0x85, + 0x6e, 0x14, 0x9c, 0xf5, 0x1c, 0x7a, 0x0e, 0x86, 0x55, 0xf3, 0xe2, 0x82, 0x38, 0x2a, 0x53, 0xae, + 0x3a, 0x45, 0x66, 0xb1, 0x8e, 0x4d, 0x3c, 0xf4, 0x2e, 0x78, 0x50, 0xff, 0xe5, 0xb9, 0xe3, 0xfc, + 0xfc, 0x78, 0x41, 0xd4, 0x02, 0x55, 0xb7, 0x70, 0x5d, 0xc8, 0x44, 0xab, 0xe3, 0x5e, 0xcf, 0xa3, + 0x75, 0x38, 0xad, 0x40, 0xe7, 0xfc, 0x98, 0x65, 0x77, 0x46, 0x64, 0xce, 0x89, 0x58, 0x24, 0x04, + 0xb0, 0xf7, 0xb4, 0x05, 0xf5, 0xd3, 0x17, 0xdc, 0xf8, 0x62, 0x16, 0x26, 0x5e, 0xc2, 0x7b, 0x50, + 0x41, 0x33, 0x50, 0x21, 0xbe, 0xb3, 0xee, 0x91, 0x95, 0xf9, 0x45, 0xb1, 0xc3, 0xd4, 0x69, 0x01, + 0x12, 0x80, 0x35, 0x8e, 0x0a, 0x6c, 0x1f, 0xe9, 0x15, 0xd8, 0x8e, 0x56, 0xe1, 0x44, 0xa3, 0xd6, + 0xa2, 0x56, 0xa3, 0x5b, 0x23, 0xb3, 0x35, 0x16, 0x8d, 0x4b, 0x3f, 0x0c, 0xaf, 0x5f, 0xaf, 0x32, + 0x84, 0x2e, 0xcc, 0xaf, 0x76, 0xe1, 0xe0, 0xcc, 0x27, 0x59, 0xd4, 0x76, 0x18, 0xec, 0x74, 0x26, + 0x8f, 0xa7, 0xa2, 0xb6, 0x69, 0x23, 0xe6, 0x30, 0x74, 0x09, 0x10, 0xcb, 0x92, 0xbb, 0x18, 0xc7, + 0x2d, 0x65, 0xa6, 0x4e, 0x9e, 0x48, 0x56, 0x06, 0x3c, 0xdf, 0x85, 0x81, 0x33, 0x9e, 0xa2, 0x56, + 0x8f, 0x1f, 0x30, 0xea, 0x93, 0x0f, 0x26, 0xad, 0x9e, 0x2b, 0xbc, 0x19, 0x4b, 0x38, 0xfa, 0x71, + 0x98, 0x6c, 0x47, 0x84, 0x6d, 0x80, 0xaf, 0x07, 0xe1, 0x96, 0x17, 0x38, 0xf5, 0x45, 0x76, 0xdd, + 0x6a, 0xdc, 0x99, 0x9c, 0x64, 0xcc, 0xcf, 0x88, 0x67, 0x27, 0xaf, 0xf6, 0xc0, 0xc3, 0x3d, 0x29, + 0xa4, 0x4b, 0x5b, 0x9e, 0xea, 0xb3, 0xb4, 0xe5, 0x2a, 0x9c, 0x90, 0x7a, 0x6d, 0x65, 0x7e, 0x51, + 0xbd, 0xf4, 0xe4, 0xe9, 0xe4, 0xfd, 0x6d, 0x8b, 0x19, 0x38, 0x38, 0xf3, 0x49, 0xfb, 0x4f, 0x2c, + 0x18, 0x55, 0x12, 0xec, 0x2e, 0x64, 0xeb, 0x7a, 0xc9, 0x6c, 0xdd, 0x0b, 0x87, 0xd7, 0x01, 0xac, + 0xe7, 0x3d, 0x72, 0x4b, 0x3e, 0x33, 0x0a, 0xa0, 0xf5, 0x84, 0x52, 0xd1, 0x56, 0x4f, 0x15, 0x7d, + 0xdf, 0xca, 0xe8, 0xac, 0x52, 0x85, 0xa5, 0x7b, 0x5b, 0xaa, 0xb0, 0x0a, 0x27, 0xe5, 0x94, 0xe2, + 0x47, 0xc4, 0x17, 0x83, 0x48, 0x89, 0x7c, 0xe3, 0x42, 0xbe, 0xc5, 0x2c, 0x24, 0x9c, 0xfd, 0x6c, + 0xc2, 0xb6, 0x1b, 0xda, 0xd7, 0xb6, 0x53, 0x52, 0x6e, 0x69, 0x43, 0x5e, 0x97, 0x99, 0x92, 0x72, + 0x4b, 0xe7, 0xab, 0x58, 0xe3, 0x64, 0xab, 0xba, 0x4a, 0x4e, 0xaa, 0x0e, 0x0e, 0xac, 0xea, 0xa4, + 0xd0, 0x1d, 0xee, 0x29, 0x74, 0xe5, 0x51, 0xd4, 0x48, 0xcf, 0xa3, 0xa8, 0x77, 0xc2, 0x98, 0xeb, + 0x6f, 0x92, 0xd0, 0x8d, 0x49, 0x9d, 0xad, 0x05, 0x26, 0x90, 0xcb, 0xda, 0xd0, 0x59, 0x4c, 0x40, + 0x71, 0x0a, 0x3b, 0xa9, 0x29, 0xc6, 0xfa, 0xd0, 0x14, 0x3d, 0xf4, 0xf3, 0x78, 0x3e, 0xfa, 0xf9, + 0xd8, 0xe1, 0xf5, 0xf3, 0xc4, 0x91, 0xea, 0x67, 0x94, 0x8b, 0x7e, 0xee, 0x4b, 0xf5, 0x19, 0x9b, + 0xf4, 0x13, 0xfb, 0x6c, 0xd2, 0x7b, 0x29, 0xe7, 0x93, 0x77, 0xac, 0x9c, 0xb3, 0xf5, 0xee, 0x03, + 0x6f, 0xea, 0xdd, 0x5c, 0xf4, 0xee, 0x47, 0x0b, 0x70, 0x52, 0x6b, 0x26, 0x2a, 0x0f, 0xdc, 0x0d, + 0x2a, 0x9b, 0xd9, 0x1d, 0xd4, 0xfc, 0x00, 0xdb, 0xc8, 0x11, 0xd7, 0x59, 0xf2, 0x0a, 0x82, 0x0d, + 0x2c, 0x96, 0x6a, 0x4d, 0x42, 0x76, 0xfb, 0x49, 0x5a, 0x6d, 0xcd, 0x8b, 0x76, 0xac, 0x30, 0xe8, + 0x20, 0xd0, 0xdf, 0xa2, 0xd2, 0x47, 0xba, 0xae, 0xf6, 0xbc, 0x06, 0x61, 0x13, 0x0f, 0x3d, 0xc1, + 0x99, 0x30, 0x91, 0x49, 0x55, 0xd7, 0x08, 0xdf, 0x56, 0x2a, 0x29, 0xa9, 0xa0, 0xb2, 0x3b, 0xac, + 0x14, 0x40, 0xa9, 0xbb, 0x3b, 0x2c, 0x16, 0x54, 0x61, 0xd8, 0xff, 0xc3, 0x82, 0x53, 0x99, 0x43, + 0x71, 0x17, 0xcc, 0x91, 0x9d, 0xa4, 0x39, 0x52, 0xcd, 0x6b, 0x4b, 0x6a, 0xbc, 0x45, 0x0f, 0xd3, + 0xe4, 0x3f, 0x58, 0x30, 0xa6, 0xf1, 0xef, 0xc2, 0xab, 0xba, 0xc9, 0x57, 0xcd, 0x6f, 0xf7, 0x5d, + 0xe9, 0x7a, 0xb7, 0xdf, 0x2d, 0x80, 0xaa, 0x75, 0x3f, 0x5b, 0x93, 0x37, 0x89, 0xec, 0x13, 0x52, + 0xd1, 0x81, 0x41, 0x16, 0x11, 0x12, 0xe5, 0x13, 0xed, 0x96, 0xe4, 0xcf, 0xa2, 0x4b, 0xf4, 0x01, + 0x1d, 0xfb, 0x1b, 0x61, 0xc1, 0x90, 0xdd, 0xcd, 0xc3, 0xcb, 0x88, 0xd7, 0x45, 0xa2, 0xaa, 0xbe, + 0x9b, 0x47, 0xb4, 0x63, 0x85, 0x41, 0x15, 0xa6, 0x5b, 0x0b, 0xfc, 0x79, 0xcf, 0x89, 0x22, 0x61, + 0xc3, 0x29, 0x85, 0xb9, 0x28, 0x01, 0x58, 0xe3, 0xb0, 0x60, 0x11, 0x37, 0x6a, 0x79, 0x4e, 0xc7, + 0xf0, 0xb1, 0x18, 0x15, 0xad, 0x14, 0x08, 0x9b, 0x78, 0x76, 0x13, 0x26, 0x93, 0x2f, 0xb1, 0x40, + 0x36, 0x58, 0xa4, 0x76, 0x5f, 0xc3, 0x39, 0x03, 0x15, 0x87, 0x3d, 0xb5, 0xd4, 0x76, 0x84, 0x4c, + 0xd0, 0xf1, 0xca, 0x12, 0x80, 0x35, 0x8e, 0xfd, 0x8f, 0x2d, 0x38, 0x9e, 0x31, 0x68, 0x39, 0x66, + 0x64, 0xc7, 0x5a, 0xda, 0x64, 0x99, 0x3a, 0xdf, 0x07, 0x43, 0x75, 0xb2, 0xe1, 0xc8, 0x58, 0x60, + 0x33, 0x75, 0x80, 0x37, 0x63, 0x09, 0xb7, 0x7f, 0xb3, 0x00, 0xe3, 0xc9, 0xbe, 0x46, 0x2c, 0x57, + 0x91, 0x0f, 0x93, 0x1b, 0xd5, 0x82, 0x6d, 0x12, 0x76, 0xe8, 0x9b, 0x5b, 0xa9, 0x5c, 0xc5, 0x2e, + 0x0c, 0x9c, 0xf1, 0x14, 0xbb, 0xe9, 0xa2, 0xae, 0x46, 0x5b, 0xce, 0xc8, 0x6b, 0x79, 0xce, 0x48, + 0xfd, 0x31, 0xcd, 0xb8, 0x21, 0xc5, 0x12, 0x9b, 0xfc, 0xa9, 0xc9, 0xc5, 0x92, 0x3f, 0xe6, 0xda, + 0xae, 0x17, 0xbb, 0xbe, 0x78, 0x65, 0x31, 0x57, 0x95, 0xc9, 0xb5, 0xdc, 0x8d, 0x82, 0xb3, 0x9e, + 0xb3, 0xbf, 0x35, 0x00, 0xaa, 0xda, 0x08, 0x8b, 0xeb, 0xcc, 0x29, 0x2a, 0xf6, 0xa0, 0x19, 0xaf, + 0x6a, 0x6e, 0x0d, 0xec, 0x15, 0x68, 0xc5, 0x1d, 0x73, 0xa6, 0x07, 0x5f, 0x0d, 0xd8, 0x9a, 0x06, + 0x61, 0x13, 0x8f, 0xf6, 0xc4, 0x73, 0xb7, 0x09, 0x7f, 0x68, 0x30, 0xd9, 0x93, 0x25, 0x09, 0xc0, + 0x1a, 0x87, 0x15, 0xb6, 0x76, 0x37, 0x36, 0x84, 0x97, 0x49, 0x17, 0xb6, 0x76, 0x37, 0x36, 0x30, + 0x83, 0xf0, 0xbb, 0x90, 0x82, 0x2d, 0xb1, 0xcd, 0x30, 0xee, 0x42, 0x0a, 0xb6, 0x30, 0x83, 0xd0, + 0xaf, 0xe4, 0x07, 0x61, 0xd3, 0xf1, 0xdc, 0xd7, 0x48, 0x5d, 0x71, 0x11, 0xdb, 0x0b, 0xf5, 0x95, + 0xae, 0x74, 0xa3, 0xe0, 0xac, 0xe7, 0xe8, 0x84, 0x6e, 0x85, 0xa4, 0xee, 0xd6, 0x62, 0x93, 0x1a, + 0x24, 0x27, 0xf4, 0x6a, 0x17, 0x06, 0xce, 0x78, 0x0a, 0xcd, 0xc2, 0xb8, 0xac, 0x16, 0x23, 0x2b, + 0x2c, 0x0e, 0x27, 0xcb, 0xb4, 0xe1, 0x24, 0x18, 0xa7, 0xf1, 0xa9, 0x90, 0x6c, 0x8a, 0xfa, 0xb0, + 0x6c, 0x37, 0x62, 0x08, 0x49, 0x59, 0x37, 0x16, 0x2b, 0x0c, 0xfb, 0x83, 0x45, 0xaa, 0xd4, 0x7b, + 0x94, 0x61, 0xbe, 0x6b, 0x51, 0xd8, 0xc9, 0x19, 0x39, 0xd0, 0xc7, 0x8c, 0x7c, 0x16, 0x46, 0x6e, + 0x44, 0x81, 0xaf, 0x22, 0x9c, 0x4b, 0x3d, 0x23, 0x9c, 0x0d, 0xac, 0xec, 0x08, 0xe7, 0xc1, 0xbc, + 0x22, 0x9c, 0x87, 0xee, 0x30, 0xc2, 0xf9, 0xf7, 0x4b, 0xa0, 0x2e, 0xbb, 0xbc, 0x42, 0xe2, 0x9b, + 0x41, 0xb8, 0xe5, 0xfa, 0x0d, 0x56, 0xf9, 0xe4, 0x0b, 0x96, 0x2c, 0x9e, 0xb2, 0x64, 0x66, 0xfe, + 0x6e, 0xe4, 0x74, 0x61, 0x61, 0x82, 0xd9, 0xf4, 0x9a, 0xc1, 0x88, 0x47, 0xca, 0xa4, 0x8a, 0xb4, + 0x88, 0x43, 0x83, 0x44, 0x8f, 0xd0, 0x4f, 0x02, 0x48, 0x97, 0xfc, 0x86, 0x94, 0xc0, 0x8b, 0xf9, + 0xf4, 0x0f, 0x93, 0x0d, 0x6d, 0x52, 0xaf, 0x29, 0x26, 0xd8, 0x60, 0x88, 0x3e, 0xaa, 0xb3, 0xa2, + 0x79, 0x2a, 0xd4, 0x7b, 0x8f, 0x64, 0x6c, 0xfa, 0xc9, 0x89, 0xc6, 0x30, 0xe4, 0xfa, 0x0d, 0x3a, + 0x4f, 0x44, 0x24, 0xe8, 0xdb, 0xb2, 0x0a, 0x6b, 0x2d, 0x05, 0x4e, 0x7d, 0xce, 0xf1, 0x1c, 0xbf, + 0x46, 0xc2, 0x45, 0x8e, 0xae, 0x35, 0xa8, 0x68, 0xc0, 0x92, 0x50, 0xd7, 0x8d, 0x9c, 0xa5, 0x7e, + 0x6e, 0xe4, 0x3c, 0xfd, 0x23, 0x30, 0xd1, 0xf5, 0x31, 0x0f, 0x94, 0x02, 0x7d, 0x88, 0x92, 0x5a, + 0xbf, 0x35, 0xa8, 0x95, 0xd6, 0x95, 0xa0, 0xce, 0x2f, 0x78, 0x0c, 0xf5, 0x17, 0x15, 0x26, 0x73, + 0x8e, 0x53, 0x44, 0xa9, 0x19, 0xa3, 0x11, 0x9b, 0x2c, 0xe9, 0x1c, 0x6d, 0x39, 0x21, 0xf1, 0x8f, + 0x7a, 0x8e, 0xae, 0x2a, 0x26, 0xd8, 0x60, 0x88, 0x36, 0x13, 0xb9, 0x7a, 0xe7, 0x0f, 0x9f, 0xab, + 0xc7, 0xca, 0x9c, 0x66, 0xdd, 0x83, 0xf6, 0xba, 0x05, 0x63, 0x7e, 0x62, 0xe6, 0xe6, 0x13, 0x9e, + 0x9f, 0xbd, 0x2a, 0xf8, 0x5d, 0xc9, 0xc9, 0x36, 0x9c, 0xe2, 0x9f, 0xa5, 0xd2, 0x4a, 0x07, 0x54, + 0x69, 0xfa, 0x82, 0xd9, 0xc1, 0x5e, 0x17, 0xcc, 0x22, 0x5f, 0xdd, 0xfc, 0x3d, 0x94, 0x47, 0x79, + 0x91, 0xc4, 0xb5, 0xdf, 0x90, 0x71, 0xe5, 0xf7, 0x75, 0x33, 0x95, 0xf7, 0xe0, 0x37, 0x40, 0x8f, + 0xf6, 0x4a, 0xf9, 0xb5, 0xff, 0xf7, 0x00, 0x1c, 0x93, 0x23, 0x22, 0x53, 0x7b, 0xa8, 0x7e, 0xe4, + 0x7c, 0xb5, 0xad, 0xac, 0xf4, 0xe3, 0x45, 0x09, 0xc0, 0x1a, 0x87, 0xda, 0x63, 0xed, 0x88, 0xac, + 0xb4, 0x88, 0xbf, 0xe4, 0xae, 0x47, 0xe2, 0xf8, 0x5d, 0x2d, 0x94, 0xab, 0x1a, 0x84, 0x4d, 0x3c, + 0x96, 0x6f, 0x6c, 0x18, 0xad, 0x66, 0xbe, 0xb1, 0x30, 0x54, 0x25, 0x1c, 0x7d, 0x36, 0xf3, 0x5e, + 0x88, 0x7c, 0x12, 0x62, 0xbb, 0x32, 0x9a, 0x0e, 0x76, 0x21, 0x04, 0xfa, 0xfb, 0x16, 0x9c, 0xe4, + 0xad, 0x72, 0x24, 0xaf, 0xb6, 0xea, 0x4e, 0x4c, 0xa2, 0x7c, 0xee, 0xd0, 0xca, 0xe8, 0x9f, 0xf6, + 0xa2, 0x67, 0xb1, 0xc5, 0xd9, 0xbd, 0x41, 0x9f, 0xb2, 0x60, 0x7c, 0x2b, 0x51, 0xdd, 0x4a, 0xaa, + 0x8e, 0xc3, 0x96, 0x8f, 0x49, 0x10, 0xd5, 0x4b, 0x2d, 0xd9, 0x1e, 0xe1, 0x34, 0x77, 0xfb, 0x2f, + 0x2d, 0x30, 0xc5, 0xe8, 0xdd, 0x2f, 0x8a, 0x75, 0x70, 0x53, 0x50, 0x5a, 0x97, 0xa5, 0x9e, 0xd6, + 0xe5, 0x23, 0x50, 0x6c, 0xbb, 0x75, 0xb1, 0xbf, 0xd0, 0x07, 0xfe, 0x8b, 0x0b, 0x98, 0xb6, 0xdb, + 0xdf, 0x2c, 0x69, 0x37, 0x88, 0xc8, 0x37, 0xfd, 0xae, 0x78, 0xed, 0x0d, 0x55, 0xed, 0x96, 0xbf, + 0xf9, 0x95, 0xae, 0x6a, 0xb7, 0x3f, 0x74, 0xf0, 0x74, 0x62, 0x3e, 0x40, 0xbd, 0x8a, 0xdd, 0x0e, + 0xed, 0x93, 0x4b, 0x7c, 0x03, 0xca, 0x74, 0x0b, 0xc6, 0xfc, 0x99, 0xe5, 0x44, 0xa7, 0xca, 0x17, + 0x45, 0xfb, 0xed, 0xdd, 0xa9, 0x1f, 0x3c, 0x78, 0xb7, 0xe4, 0xd3, 0x58, 0xd1, 0x47, 0x11, 0x54, + 0xe8, 0x6f, 0x96, 0xf6, 0x2c, 0x36, 0x77, 0x57, 0x95, 0xcc, 0x94, 0x80, 0x5c, 0x72, 0xaa, 0x35, + 0x1f, 0xe4, 0x43, 0x85, 0x22, 0x72, 0xa6, 0x7c, 0x0f, 0xb8, 0xaa, 0x92, 0x8f, 0x25, 0xe0, 0xf6, + 0xee, 0xd4, 0x0b, 0x07, 0x67, 0xaa, 0x1e, 0xc7, 0x9a, 0x85, 0xa1, 0x1a, 0x87, 0x7b, 0xde, 0xbd, + 0xfe, 0x7f, 0x06, 0xf4, 0xfc, 0x16, 0x85, 0x90, 0xbf, 0x2b, 0xe6, 0xf7, 0xf3, 0xa9, 0xf9, 0x7d, + 0xa6, 0x6b, 0x7e, 0x8f, 0xd1, 0x31, 0xcb, 0x28, 0xcf, 0x7c, 0xb7, 0x8d, 0x85, 0xfd, 0x7d, 0x12, + 0xcc, 0x4a, 0x7a, 0xb5, 0xed, 0x86, 0x24, 0x5a, 0x0d, 0xdb, 0xbe, 0xeb, 0x37, 0xd8, 0x94, 0x2d, + 0x9b, 0x56, 0x52, 0x02, 0x8c, 0xd3, 0xf8, 0x74, 0xe3, 0x4f, 0xe7, 0xc5, 0x75, 0x67, 0x9b, 0xcf, + 0x3c, 0xa3, 0x08, 0x65, 0x55, 0xb4, 0x63, 0x85, 0x81, 0x36, 0xe1, 0x61, 0x49, 0x60, 0x81, 0x78, + 0x84, 0xbe, 0x10, 0x0b, 0x64, 0x0c, 0x9b, 0x3c, 0x6d, 0x80, 0xc7, 0xa2, 0xbc, 0x55, 0x50, 0x78, + 0x18, 0xef, 0x81, 0x8b, 0xf7, 0xa4, 0x64, 0x7f, 0x91, 0x85, 0x2e, 0x18, 0xd5, 0x1f, 0xe8, 0xec, + 0xf3, 0xdc, 0xa6, 0x2b, 0x6b, 0x65, 0xaa, 0xd9, 0xb7, 0x44, 0x1b, 0x31, 0x87, 0xa1, 0x9b, 0x30, + 0xb4, 0xce, 0xef, 0x64, 0xcf, 0xe7, 0x2e, 0x24, 0x71, 0xc1, 0x3b, 0xab, 0x93, 0x2d, 0x6f, 0x7b, + 0xbf, 0xad, 0x7f, 0x62, 0xc9, 0xcd, 0xfe, 0x5a, 0x09, 0xc6, 0x65, 0x78, 0xd9, 0x45, 0x37, 0x62, + 0x11, 0x09, 0xe6, 0xe5, 0x01, 0x85, 0x7d, 0x2f, 0x0f, 0x78, 0x0f, 0x40, 0x9d, 0xb4, 0xbc, 0xa0, + 0xc3, 0x8c, 0xc3, 0x81, 0x03, 0x1b, 0x87, 0x6a, 0x3f, 0xb1, 0xa0, 0xa8, 0x60, 0x83, 0xa2, 0x28, + 0x10, 0xca, 0xef, 0x22, 0x48, 0x15, 0x08, 0x35, 0x6e, 0x4c, 0x1b, 0xbc, 0xbb, 0x37, 0xa6, 0xb9, + 0x30, 0xce, 0xbb, 0xa8, 0x6a, 0x2c, 0xdc, 0x41, 0x29, 0x05, 0x96, 0xa5, 0xb6, 0x90, 0x24, 0x83, + 0xd3, 0x74, 0xcd, 0xeb, 0xd0, 0xca, 0x77, 0xfb, 0x3a, 0xb4, 0xb7, 0x43, 0x45, 0x7e, 0xe7, 0x68, + 0xb2, 0xa2, 0xeb, 0xff, 0xc8, 0x69, 0x10, 0x61, 0x0d, 0xef, 0x2a, 0x17, 0x03, 0xf7, 0xaa, 0x5c, + 0x8c, 0xfd, 0x7a, 0x91, 0xee, 0x2a, 0x78, 0xbf, 0x0e, 0x7c, 0x9b, 0xe0, 0x45, 0xe3, 0x36, 0xc1, + 0x83, 0x7d, 0xcf, 0x72, 0xea, 0xd6, 0xc1, 0x87, 0x61, 0x20, 0x76, 0x1a, 0x32, 0xa9, 0x96, 0x41, + 0xd7, 0x9c, 0x46, 0x84, 0x59, 0xeb, 0x41, 0xea, 0x29, 0xbf, 0x00, 0xa3, 0x91, 0xdb, 0xf0, 0x9d, + 0xb8, 0x1d, 0x12, 0xe3, 0xfc, 0x52, 0x07, 0xe9, 0x98, 0x40, 0x9c, 0xc4, 0x45, 0x1f, 0xb2, 0x00, + 0x42, 0xa2, 0xf6, 0x2c, 0x83, 0x79, 0xcc, 0x21, 0x25, 0x06, 0x24, 0x5d, 0xb3, 0xcc, 0x87, 0xda, + 0xab, 0x18, 0x6c, 0xed, 0x8f, 0x58, 0x30, 0xd1, 0xf5, 0x14, 0x6a, 0xc1, 0x60, 0x8d, 0xdd, 0xf9, + 0x98, 0x4f, 0x1d, 0xc9, 0xe4, 0xfd, 0x91, 0x5c, 0x39, 0xf1, 0x36, 0x2c, 0xf8, 0xd8, 0x5f, 0x1e, + 0x81, 0x13, 0xd5, 0xf9, 0x65, 0x79, 0x03, 0xd0, 0x91, 0x65, 0x09, 0x67, 0xf1, 0xb8, 0x7b, 0x59, + 0xc2, 0x3d, 0xb8, 0x7b, 0x46, 0x96, 0xb0, 0x67, 0x64, 0x09, 0x27, 0x53, 0x36, 0x8b, 0x79, 0xa4, + 0x6c, 0x66, 0xf5, 0xa0, 0x9f, 0x94, 0xcd, 0x23, 0x4b, 0x1b, 0xde, 0xb3, 0x43, 0x07, 0x4a, 0x1b, + 0x56, 0x39, 0xd5, 0xb9, 0x64, 0x88, 0xf5, 0xf8, 0x54, 0x99, 0x39, 0xd5, 0x2a, 0x9f, 0x95, 0x67, + 0x3f, 0x0a, 0xa5, 0xf7, 0x72, 0xfe, 0x1d, 0xe8, 0x23, 0x9f, 0x55, 0x24, 0x60, 0x9a, 0x39, 0xd4, + 0x43, 0x79, 0xe4, 0x50, 0x67, 0x75, 0x67, 0xdf, 0x1c, 0xea, 0x17, 0x60, 0xb4, 0xe6, 0x05, 0x3e, + 0x59, 0x0d, 0x83, 0x38, 0xa8, 0x05, 0xf2, 0x86, 0x6d, 0x7d, 0x59, 0xa2, 0x09, 0xc4, 0x49, 0xdc, + 0x5e, 0x09, 0xd8, 0x95, 0xc3, 0x26, 0x60, 0xc3, 0x3d, 0x4a, 0xc0, 0x36, 0x52, 0x8c, 0x87, 0xf3, + 0x48, 0x31, 0xce, 0xfa, 0x22, 0x7d, 0xa5, 0x18, 0xbf, 0xc1, 0x2f, 0x98, 0xa7, 0x9b, 0x11, 0x2e, + 0x85, 0xd9, 0x11, 0xdd, 0xf0, 0xd9, 0x57, 0x8e, 0x60, 0xc2, 0x5e, 0xaf, 0x6a, 0x36, 0xea, 0xd2, + 0x79, 0xdd, 0x84, 0x93, 0x1d, 0x39, 0x4c, 0x5a, 0xf2, 0xe7, 0x0a, 0xf0, 0x3d, 0xfb, 0x76, 0x01, + 0xdd, 0x04, 0x88, 0x9d, 0x86, 0x98, 0xa8, 0xe2, 0x20, 0xeb, 0x90, 0x71, 0xc5, 0x6b, 0x92, 0x1e, + 0xaf, 0xc1, 0xa5, 0xfe, 0xb2, 0x23, 0x22, 0xf9, 0x9b, 0x85, 0x13, 0x07, 0x5e, 0x57, 0x09, 0x68, + 0x1c, 0x78, 0x04, 0x33, 0x08, 0x35, 0x84, 0x42, 0xd2, 0xa0, 0xc6, 0x7d, 0x31, 0x69, 0x08, 0x61, + 0xd6, 0x8a, 0x05, 0x14, 0x3d, 0x07, 0xc3, 0x8e, 0xe7, 0xf1, 0xf4, 0x3d, 0x12, 0x89, 0x5b, 0x4c, + 0x75, 0x2d, 0x5a, 0x0d, 0xc2, 0x26, 0x9e, 0xfd, 0x17, 0x05, 0x98, 0xda, 0x47, 0xa6, 0x74, 0xa5, + 0x6d, 0x97, 0xfa, 0x4e, 0xdb, 0x16, 0xe9, 0x4a, 0x83, 0x3d, 0xd2, 0x95, 0x9e, 0x83, 0xe1, 0x98, + 0x38, 0x4d, 0x11, 0x89, 0x98, 0x2e, 0xb1, 0xb8, 0xa6, 0x41, 0xd8, 0xc4, 0xa3, 0x52, 0x6c, 0xcc, + 0xa9, 0xd5, 0x48, 0x14, 0xc9, 0x7c, 0x24, 0xe1, 0xe5, 0xce, 0x2d, 0xd9, 0x89, 0x1d, 0x1e, 0xcc, + 0x26, 0x58, 0xe0, 0x14, 0xcb, 0xf4, 0x80, 0x57, 0xfa, 0x1c, 0xf0, 0x5f, 0x2e, 0xc0, 0x23, 0x7b, + 0x6a, 0xb7, 0xbe, 0x53, 0xc5, 0xda, 0x11, 0x09, 0xd3, 0x13, 0xe7, 0x6a, 0x44, 0x42, 0xcc, 0x20, + 0x7c, 0x94, 0x5a, 0x2d, 0x15, 0x45, 0x9e, 0x7f, 0x6e, 0x25, 0x1f, 0xa5, 0x04, 0x0b, 0x9c, 0x62, + 0x79, 0xa7, 0xd3, 0xf2, 0x6b, 0x03, 0xf0, 0x58, 0x1f, 0x36, 0x40, 0x8e, 0x39, 0xa8, 0xc9, 0x7c, + 0xe9, 0xe2, 0x3d, 0xca, 0x97, 0xbe, 0xb3, 0xe1, 0x7a, 0x33, 0xcd, 0xba, 0xaf, 0x5c, 0xd7, 0x2f, + 0x16, 0xe0, 0x74, 0x6f, 0x83, 0x05, 0xfd, 0x30, 0x8c, 0x87, 0x2a, 0x24, 0xd1, 0x4c, 0xb5, 0x3e, + 0xce, 0x7d, 0x5c, 0x09, 0x10, 0x4e, 0xe3, 0xa2, 0x69, 0x80, 0x96, 0x13, 0x6f, 0x46, 0xe7, 0x76, + 0xdc, 0x28, 0x16, 0xb5, 0xe9, 0xc6, 0xf8, 0xc9, 0xab, 0x6c, 0xc5, 0x06, 0x06, 0x65, 0xc7, 0xfe, + 0x2d, 0x04, 0x57, 0x82, 0x98, 0x3f, 0xc4, 0xb7, 0x9e, 0xc7, 0xe5, 0x95, 0x87, 0x06, 0x08, 0xa7, + 0x71, 0x29, 0x3b, 0x76, 0xb6, 0xcf, 0x3b, 0xca, 0xf7, 0xa4, 0x8c, 0xdd, 0x92, 0x6a, 0xc5, 0x06, + 0x46, 0x3a, 0x89, 0xbc, 0xb4, 0x7f, 0x12, 0xb9, 0xfd, 0xcf, 0x0b, 0x70, 0xaa, 0xa7, 0xc1, 0xdb, + 0x9f, 0x98, 0xba, 0xff, 0x12, 0xbf, 0xef, 0x70, 0x85, 0x1d, 0x28, 0x61, 0xd8, 0xfe, 0xd3, 0x1e, + 0x33, 0x4d, 0x24, 0x03, 0xdf, 0x79, 0x1d, 0x94, 0xfb, 0x6f, 0x3c, 0xbb, 0xf2, 0x7f, 0x07, 0x0e, + 0x90, 0xff, 0x9b, 0xfa, 0x18, 0xa5, 0x3e, 0xb5, 0xc3, 0x7f, 0x19, 0xe8, 0x39, 0xbc, 0x74, 0x83, + 0xdc, 0xd7, 0x09, 0xc2, 0x02, 0x1c, 0x73, 0x7d, 0x76, 0x89, 0x6d, 0xb5, 0xbd, 0x2e, 0xca, 0x95, + 0xf1, 0x9a, 0xbc, 0x2a, 0xfb, 0x66, 0x31, 0x05, 0xc7, 0x5d, 0x4f, 0xdc, 0x87, 0xf9, 0xd8, 0x77, + 0x36, 0xa4, 0x07, 0x94, 0xdc, 0x2b, 0x70, 0x52, 0x0e, 0xc5, 0xa6, 0x13, 0x92, 0xba, 0x50, 0xb6, + 0x91, 0xc8, 0xb7, 0x3a, 0xc5, 0x73, 0xb6, 0x32, 0x10, 0x70, 0xf6, 0x73, 0xec, 0xc6, 0xd1, 0xa0, + 0xe5, 0xd6, 0xc4, 0x56, 0x50, 0xdf, 0x38, 0x4a, 0x1b, 0x31, 0x87, 0x69, 0x7d, 0x51, 0xb9, 0x3b, + 0xfa, 0xe2, 0x3d, 0x50, 0x51, 0xe3, 0xcd, 0x73, 0x2a, 0xd4, 0x24, 0xef, 0xca, 0xa9, 0x50, 0x33, + 0xdc, 0xc0, 0xda, 0xef, 0x62, 0xff, 0x67, 0x60, 0x44, 0xf9, 0x02, 0xfb, 0xbd, 0xf7, 0xd5, 0xfe, + 0xbf, 0x05, 0x48, 0x5d, 0x71, 0x86, 0x76, 0xa0, 0x52, 0x97, 0x57, 0xeb, 0xe7, 0x53, 0x13, 0x5a, + 0xdd, 0xd4, 0xaf, 0x0f, 0xc2, 0x54, 0x13, 0xd6, 0xcc, 0xd0, 0xfb, 0x78, 0xf9, 0x65, 0xc1, 0xba, + 0x90, 0x47, 0x4e, 0x7e, 0x55, 0xd1, 0x33, 0x2f, 0x76, 0x94, 0x6d, 0xd8, 0xe0, 0x87, 0x62, 0xa8, + 0x6c, 0xca, 0xab, 0xdc, 0xf2, 0x11, 0x77, 0xea, 0x66, 0x38, 0x6e, 0xa2, 0xa9, 0xbf, 0x58, 0x33, + 0xb2, 0xff, 0xa4, 0x00, 0x27, 0x92, 0x1f, 0x40, 0x1c, 0x5c, 0xfe, 0xaa, 0x05, 0x0f, 0x7a, 0x4e, + 0x14, 0x57, 0xdb, 0x6c, 0xa3, 0xb0, 0xd1, 0xf6, 0x56, 0x52, 0x95, 0xba, 0x0f, 0xeb, 0x6c, 0x51, + 0x84, 0xd3, 0x57, 0xff, 0xcd, 0x3d, 0x74, 0x6b, 0x77, 0xea, 0xc1, 0xa5, 0x6c, 0xe6, 0xb8, 0x57, + 0xaf, 0xd0, 0xeb, 0x16, 0x1c, 0xab, 0xb5, 0xc3, 0x90, 0xf8, 0xb1, 0xee, 0x2a, 0xff, 0x8a, 0x57, + 0x72, 0x19, 0x48, 0xdd, 0xc1, 0x13, 0x54, 0xa0, 0xce, 0xa7, 0x78, 0xe1, 0x2e, 0xee, 0xf6, 0xcf, + 0x53, 0xcd, 0xd9, 0xf3, 0x3d, 0xff, 0x9a, 0xdd, 0x55, 0xf8, 0x67, 0x83, 0x30, 0x9a, 0x28, 0x47, + 0x9e, 0x38, 0xec, 0xb3, 0xf6, 0x3d, 0xec, 0x63, 0x19, 0x82, 0x6d, 0x5f, 0x5e, 0xe3, 0x6e, 0x64, + 0x08, 0xb6, 0x7d, 0x82, 0x39, 0x4c, 0x0c, 0x29, 0x6e, 0xfb, 0x22, 0x17, 0xc0, 0x1c, 0x52, 0xdc, + 0xf6, 0xb1, 0x80, 0xa2, 0x0f, 0x58, 0x30, 0xc2, 0x16, 0x9f, 0x38, 0x2a, 0x15, 0x0a, 0xed, 0x52, + 0x0e, 0xcb, 0x5d, 0x96, 0xde, 0x67, 0xb1, 0xa3, 0x66, 0x0b, 0x4e, 0x70, 0x44, 0x1f, 0xb6, 0xa0, + 0xa2, 0xee, 0x8c, 0x15, 0x67, 0x23, 0xd5, 0x7c, 0xab, 0xbd, 0xa7, 0xa4, 0x9e, 0x2a, 0xbb, 0x8d, + 0x35, 0x63, 0x14, 0xa9, 0x73, 0xcc, 0xa1, 0xa3, 0x39, 0xc7, 0x84, 0x8c, 0x33, 0xcc, 0xb7, 0x43, + 0xa5, 0xe9, 0xf8, 0xee, 0x06, 0x89, 0x62, 0x7e, 0xb4, 0x28, 0x2f, 0xf7, 0x90, 0x8d, 0x58, 0xc3, + 0xa9, 0xb1, 0x1f, 0xb1, 0x17, 0x8b, 0x8d, 0xb3, 0x40, 0x66, 0xec, 0x57, 0x75, 0x33, 0x36, 0x71, + 0xcc, 0x83, 0x4b, 0xb8, 0xa7, 0x07, 0x97, 0xc3, 0xfb, 0x1c, 0x5c, 0x56, 0xe1, 0xa4, 0xd3, 0x8e, + 0x83, 0x8b, 0xc4, 0xf1, 0x66, 0xe3, 0x98, 0x34, 0x5b, 0x71, 0xc4, 0x2b, 0xd8, 0x8f, 0x30, 0x17, + 0xb0, 0x8a, 0x76, 0xab, 0x12, 0x6f, 0xa3, 0x0b, 0x09, 0x67, 0x3f, 0x6b, 0xff, 0x53, 0x0b, 0x4e, + 0x66, 0x4e, 0x85, 0xfb, 0x37, 0xcf, 0xc0, 0xfe, 0x74, 0x09, 0x8e, 0x67, 0x5c, 0x56, 0x80, 0x3a, + 0xe6, 0x22, 0xb1, 0xf2, 0x08, 0xd9, 0x4b, 0x46, 0xa0, 0xc9, 0x6f, 0x93, 0xb1, 0x32, 0x0e, 0x16, + 0x8b, 0xa0, 0xe3, 0x01, 0x8a, 0x77, 0x37, 0x1e, 0xc0, 0x98, 0xeb, 0x03, 0xf7, 0x74, 0xae, 0x97, + 0xf6, 0x99, 0xeb, 0x5f, 0xb2, 0x60, 0xb2, 0xd9, 0xe3, 0xe6, 0x31, 0x71, 0x9e, 0x74, 0xed, 0x68, + 0xee, 0x35, 0x9b, 0x7b, 0xf8, 0xd6, 0xee, 0x54, 0xcf, 0x0b, 0xdf, 0x70, 0xcf, 0x5e, 0xd9, 0xdf, + 0x2a, 0x02, 0xb3, 0xd7, 0x58, 0x41, 0xea, 0x0e, 0x7a, 0xbf, 0x79, 0xe7, 0x89, 0x95, 0xd7, 0xfd, + 0x1c, 0x9c, 0xb8, 0xba, 0x33, 0x85, 0x8f, 0x60, 0xd6, 0x15, 0x2a, 0x69, 0x49, 0x58, 0xe8, 0x43, + 0x12, 0x7a, 0xf2, 0x72, 0x99, 0x62, 0xfe, 0x97, 0xcb, 0x54, 0xd2, 0x17, 0xcb, 0xec, 0xfd, 0x89, + 0x07, 0xee, 0xcb, 0x4f, 0xfc, 0xdb, 0x16, 0x17, 0x3c, 0xa9, 0xaf, 0xa0, 0xcd, 0x0d, 0x6b, 0x0f, + 0x73, 0xe3, 0x49, 0x28, 0x47, 0x42, 0x32, 0x0b, 0xb3, 0x44, 0x87, 0x82, 0x89, 0x76, 0xac, 0x30, + 0xe8, 0xae, 0xcb, 0xf1, 0xbc, 0xe0, 0xe6, 0xb9, 0x66, 0x2b, 0xee, 0x08, 0x03, 0x45, 0x6d, 0x0b, + 0x66, 0x15, 0x04, 0x1b, 0x58, 0xe8, 0x31, 0x18, 0xe4, 0x95, 0x26, 0x84, 0x73, 0x67, 0x98, 0xae, + 0x43, 0x5e, 0x86, 0xa2, 0x8e, 0x05, 0xc8, 0xde, 0x04, 0x63, 0x57, 0x71, 0xe7, 0xf7, 0x40, 0xab, + 0x7b, 0x65, 0x0b, 0xbd, 0xee, 0x95, 0xb5, 0xff, 0x6e, 0x41, 0xb0, 0xe2, 0xbb, 0x04, 0x1d, 0x19, + 0x68, 0x1d, 0x30, 0x32, 0xf0, 0x7d, 0x00, 0xb5, 0xa0, 0xd9, 0xa2, 0xfb, 0xe6, 0xb5, 0x20, 0x9f, + 0xcd, 0xd6, 0xbc, 0xa2, 0xa7, 0x47, 0x55, 0xb7, 0x61, 0x83, 0x5f, 0x42, 0xb4, 0x17, 0xf7, 0x15, + 0xed, 0x09, 0x29, 0x37, 0xb0, 0xb7, 0x94, 0xb3, 0xff, 0xc2, 0x82, 0x84, 0xd5, 0x87, 0x5a, 0x50, + 0xa2, 0xdd, 0xed, 0x08, 0x81, 0xb1, 0x92, 0x9f, 0x89, 0x49, 0x25, 0xb5, 0x58, 0x85, 0xec, 0x27, + 0xe6, 0x8c, 0x90, 0x27, 0xa2, 0x20, 0x73, 0xd9, 0xfc, 0x98, 0x0c, 0x2f, 0x06, 0xc1, 0x16, 0x0f, + 0x26, 0xd2, 0x11, 0x95, 0xf6, 0xf3, 0x30, 0xd1, 0xd5, 0x29, 0x76, 0x77, 0x74, 0x20, 0x77, 0xf0, + 0xc6, 0xea, 0x61, 0x05, 0x1f, 0x30, 0x87, 0xd9, 0x5f, 0xb4, 0xe0, 0x58, 0x9a, 0x3c, 0x7a, 0xc3, + 0x82, 0x89, 0x28, 0x4d, 0xef, 0xa8, 0xc6, 0x4e, 0x65, 0x3b, 0x74, 0x81, 0x70, 0x77, 0x27, 0xec, + 0xff, 0x2e, 0xb4, 0xc1, 0x75, 0xd7, 0xaf, 0x07, 0x37, 0x95, 0x9d, 0x64, 0xf5, 0xb4, 0x93, 0xa8, + 0x78, 0xa8, 0x6d, 0x92, 0x7a, 0xdb, 0xeb, 0x2a, 0x43, 0x51, 0x15, 0xed, 0x58, 0x61, 0xb0, 0xac, + 0xfb, 0xb6, 0xd8, 0xb7, 0xa6, 0x26, 0xe5, 0x82, 0x68, 0xc7, 0x0a, 0x03, 0x3d, 0x0b, 0x23, 0xc6, + 0x4b, 0xca, 0x79, 0xc9, 0x36, 0x1d, 0x86, 0x06, 0x8f, 0x70, 0x02, 0x0b, 0x4d, 0x03, 0x28, 0x9b, + 0x4b, 0x6a, 0x6c, 0xe6, 0x68, 0x57, 0x82, 0x31, 0xc2, 0x06, 0x06, 0xab, 0x71, 0xe1, 0xb5, 0x23, + 0x76, 0x92, 0x3c, 0xa8, 0x2f, 0x68, 0x98, 0x17, 0x6d, 0x58, 0x41, 0xa9, 0x70, 0x6b, 0x3a, 0x7e, + 0xdb, 0xf1, 0xe8, 0x08, 0x09, 0xd7, 0x99, 0x5a, 0x86, 0xcb, 0x0a, 0x82, 0x0d, 0x2c, 0xfa, 0xc6, + 0xb1, 0xdb, 0x24, 0x2f, 0x05, 0xbe, 0x8c, 0x52, 0xd7, 0xc1, 0x05, 0xa2, 0x1d, 0x2b, 0x0c, 0xf4, + 0x3c, 0x0c, 0x3b, 0x7e, 0x9d, 0x1b, 0x88, 0x41, 0x28, 0xce, 0x28, 0xd5, 0xee, 0xf3, 0x6a, 0x44, + 0x66, 0x35, 0x14, 0x9b, 0xa8, 0xe9, 0xdb, 0x29, 0xa0, 0xcf, 0xdb, 0xef, 0xfe, 0xdc, 0x82, 0x71, + 0x5d, 0xb4, 0x88, 0x79, 0xd8, 0x12, 0xae, 0x45, 0x6b, 0x5f, 0xd7, 0x62, 0xb2, 0x76, 0x49, 0xa1, + 0xaf, 0xda, 0x25, 0x66, 0x59, 0x91, 0xe2, 0x9e, 0x65, 0x45, 0xbe, 0x17, 0x86, 0xb6, 0x48, 0xc7, + 0xa8, 0x3f, 0xc2, 0x94, 0xc3, 0x65, 0xde, 0x84, 0x25, 0x0c, 0xd9, 0x30, 0x58, 0x73, 0x54, 0x0d, + 0xc3, 0x11, 0x11, 0x9b, 0x36, 0xcb, 0x90, 0x04, 0xc4, 0x5e, 0x81, 0x8a, 0x3a, 0xd4, 0x97, 0x9e, + 0x3e, 0x2b, 0xdb, 0xd3, 0xd7, 0x57, 0x79, 0x83, 0xb9, 0xf5, 0xaf, 0x7e, 0xfb, 0xd1, 0xb7, 0xfc, + 0xe1, 0xb7, 0x1f, 0x7d, 0xcb, 0x1f, 0x7f, 0xfb, 0xd1, 0xb7, 0x7c, 0xe0, 0xd6, 0xa3, 0xd6, 0x57, + 0x6f, 0x3d, 0x6a, 0xfd, 0xe1, 0xad, 0x47, 0xad, 0x3f, 0xbe, 0xf5, 0xa8, 0xf5, 0xad, 0x5b, 0x8f, + 0x5a, 0xaf, 0xff, 0xe7, 0x47, 0xdf, 0xf2, 0x52, 0x66, 0x5e, 0x04, 0xfd, 0xf1, 0x54, 0xad, 0x3e, + 0xb3, 0xfd, 0x0c, 0x0b, 0xcd, 0xa7, 0xeb, 0x79, 0xc6, 0x98, 0xc4, 0x33, 0x72, 0x3d, 0xff, 0xbf, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x5f, 0xe8, 0xa1, 0xdb, 0xd8, 0xff, 0x00, 0x00, } func (m *AWSAuthConfig) Marshal() (dAtA []byte, err error) { @@ -12121,6 +12123,14 @@ func (m *PullRequestGenerator) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + i-- + if m.ContinueOnRepoNotFoundError { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x58 if len(m.Values) > 0 { keysForValues := make([]string, 0, len(m.Values)) for k := range m.Values { @@ -18501,6 +18511,7 @@ func (m *PullRequestGenerator) Size() (n int) { n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) } } + n += 2 return n } @@ -21782,6 +21793,7 @@ func (this *PullRequestGenerator) String() string { `Bitbucket:` + strings.Replace(this.Bitbucket.String(), "PullRequestGeneratorBitbucket", "PullRequestGeneratorBitbucket", 1) + `,`, `AzureDevOps:` + strings.Replace(this.AzureDevOps.String(), "PullRequestGeneratorAzureDevOps", "PullRequestGeneratorAzureDevOps", 1) + `,`, `Values:` + mapStringForValues + `,`, + `ContinueOnRepoNotFoundError:` + fmt.Sprintf("%v", this.ContinueOnRepoNotFoundError) + `,`, `}`, }, "") return s @@ -43862,6 +43874,26 @@ func (m *PullRequestGenerator) Unmarshal(dAtA []byte) error { } m.Values[mapkey] = mapvalue iNdEx = postIndex + case 11: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ContinueOnRepoNotFoundError", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.ContinueOnRepoNotFoundError = bool(v != 0) default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) From 901fe22b6d385d87c1368e9ea9de8356db033a8a Mon Sep 17 00:00:00 2001 From: Patroklos Papapetrou Date: Tue, 16 Sep 2025 18:29:03 +0300 Subject: [PATCH 12/13] final changes after rebase Signed-off-by: Patroklos Papapetrou --- applicationset/services/pull_request/gitea_test.go | 2 +- util/kustomize/kustomize_test.go | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/applicationset/services/pull_request/gitea_test.go b/applicationset/services/pull_request/gitea_test.go index fc51cb0ff1887..55c654f2923d8 100644 --- a/applicationset/services/pull_request/gitea_test.go +++ b/applicationset/services/pull_request/gitea_test.go @@ -359,7 +359,7 @@ func TestGiteaListReturnsRepositoryNotFoundError(t *testing.T) { _, _ = w.Write([]byte(`{"message": "404 Project Not Found"}`)) }) - svc, err := NewGiteaService("", server.URL, "nonexistent", "nonexistent", false) + svc, err := NewGiteaService("", server.URL, "nonexistent", "nonexistent", nil, false) require.NoError(t, err) prs, err := svc.List(t.Context()) diff --git a/util/kustomize/kustomize_test.go b/util/kustomize/kustomize_test.go index e004cd4360403..e29b9a6124ef6 100644 --- a/util/kustomize/kustomize_test.go +++ b/util/kustomize/kustomize_test.go @@ -522,7 +522,7 @@ func TestKustomizeBuildComponentsMonoRepo(t *testing.T) { Components: []string{"../../../../../../kustomize/components/all"}, IgnoreMissingComponents: true, } - objs, _, _, err := kustomize.Build(&kustomizeSource, nil, nil, nil) + objs, _, _, err := kustomize.Build(&kustomizeSource, nil, nil, nil, "") require.NoError(t, err) obj := objs[2] require.Equal(t, "hello-world-kustomize", obj.GetName()) @@ -611,7 +611,7 @@ func TestFailKustomizeBuildPatches(t *testing.T) { }, } - _, _, _, err = kustomize.Build(&kustomizeSource, nil, nil, nil, "") + _, _, _, err = kustomize.Build(&kustomizeSource, nil, nil, nil, "some-namespace") require.EqualError(t, err, "kustomization file not found in the path") } @@ -626,7 +626,7 @@ func TestKustomizeBuildComponentsNoFoundComponents(t *testing.T) { Components: []string{"./non-existent-component1", "./non-existent-component2"}, IgnoreMissingComponents: true, } - _, _, commands, err := kustomize.Build(&kustomizeSource, nil, nil, nil) + _, _, commands, err := kustomize.Build(&kustomizeSource, nil, nil, nil, "") require.NoError(t, err) // Verify that no "edit add component" command was executed From f4808a5850d7dae0d1f037c49f0b93fbde7d5831 Mon Sep 17 00:00:00 2001 From: Patroklos Papapetrou Date: Wed, 17 Sep 2025 13:57:15 +0300 Subject: [PATCH 13/13] address new linter issues Signed-off-by: Patroklos Papapetrou --- acr_controller/application/client.go | 8 ++--- acr_controller/controller/broadcaster.go | 4 +-- acr_controller/controller/controller.go | 20 +++--------- acr_controller/server.go | 26 ++------------- acr_controller/service/acr_service_test.go | 8 ++--- .../application_change_revision_controller.go | 4 --- .../application_rollout_rollback.go | 32 +++++++++---------- .../application_validate_src_and_dest.go | 4 +-- server/application/cf_application.go | 4 +-- util/exec/exec_test.go | 6 ++-- util/kustomize/repospec.go | 2 +- util/kustomize/repospec_test.go | 2 +- 12 files changed, 41 insertions(+), 79 deletions(-) diff --git a/acr_controller/application/client.go b/acr_controller/application/client.go index bd2a23cda7ede..08021c3148c53 100644 --- a/acr_controller/application/client.go +++ b/acr_controller/application/client.go @@ -23,7 +23,6 @@ type httpApplicationClient struct { httpClient *http.Client baseURL string token string - rootpath string } func NewHTTPApplicationClient(token string, address string, rootpath string) ApplicationClient { @@ -47,14 +46,13 @@ func NewHTTPApplicationClient(token string, address string, rootpath string) App TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, }, }, - baseURL: address, - token: token, - rootpath: rootpath, + baseURL: address, + token: token, } } func (c *httpApplicationClient) execute(ctx context.Context, url string, result any) error { - req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, http.NoBody) if err != nil { return err } diff --git a/acr_controller/controller/broadcaster.go b/acr_controller/controller/broadcaster.go index fa80d0620b756..f5485fd922f41 100644 --- a/acr_controller/controller/broadcaster.go +++ b/acr_controller/controller/broadcaster.go @@ -57,9 +57,7 @@ func (b *broadcasterHandler) notify(event *appv1.ApplicationWatchEvent) { if s.matches(event) { select { case s.ch <- event: - { - // log.Infof("adding application '%s' to channel", event.Application.Name) - } + log.Infof("adding application '%s' to channel", event.Application.Name) default: // drop event if cannot send right away log.WithField("application", event.Application.Name).Warn("unable to send event notification") diff --git a/acr_controller/controller/controller.go b/acr_controller/controller/controller.go index 8215665f39912..b880b94f01243 100644 --- a/acr_controller/controller/controller.go +++ b/acr_controller/controller/controller.go @@ -13,8 +13,6 @@ import ( appclientset "github.com/argoproj/argo-cd/v3/pkg/client/clientset/versioned" appv1 "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" - applisters "github.com/argoproj/argo-cd/v3/pkg/client/listers/application/v1alpha1" - servercache "github.com/argoproj/argo-cd/v3/server/cache" ) var watchAPIBufferSize = 1000 @@ -24,27 +22,19 @@ type ACRController interface { } type applicationChangeRevisionController struct { - appBroadcaster Broadcaster - cache *servercache.Cache - appLister applisters.ApplicationLister - applicationServiceClient appclient.ApplicationClient - acrService service.ACRService - applicationClientset appclientset.Interface + appBroadcaster Broadcaster + acrService service.ACRService } -func NewApplicationChangeRevisionController(appInformer cache.SharedIndexInformer, cache *servercache.Cache, applicationServiceClient appclient.ApplicationClient, appLister applisters.ApplicationLister, applicationClientset appclientset.Interface) ACRController { +func NewApplicationChangeRevisionController(appInformer cache.SharedIndexInformer, applicationServiceClient appclient.ApplicationClient, applicationClientset appclientset.Interface) ACRController { appBroadcaster := NewBroadcaster() _, err := appInformer.AddEventHandler(appBroadcaster) if err != nil { log.Error(err) } return &applicationChangeRevisionController{ - appBroadcaster: appBroadcaster, - cache: cache, - applicationServiceClient: applicationServiceClient, - appLister: appLister, - applicationClientset: applicationClientset, - acrService: service.NewACRService(applicationClientset, applicationServiceClient), + appBroadcaster: appBroadcaster, + acrService: service.NewACRService(applicationClientset, applicationServiceClient), } } diff --git a/acr_controller/server.go b/acr_controller/server.go index eb9f7f0150cfb..30d5000b116a6 100644 --- a/acr_controller/server.go +++ b/acr_controller/server.go @@ -2,7 +2,6 @@ package acr_controller import ( "context" - "crypto/tls" "fmt" "net" "net/http" @@ -20,10 +19,8 @@ import ( appclientset "github.com/argoproj/argo-cd/v3/pkg/client/clientset/versioned" appinformer "github.com/argoproj/argo-cd/v3/pkg/client/informers/externalversions" - applisters "github.com/argoproj/argo-cd/v3/pkg/client/listers/application/v1alpha1" servercache "github.com/argoproj/argo-cd/v3/server/cache" "github.com/argoproj/argo-cd/v3/util/healthz" - settings_util "github.com/argoproj/argo-cd/v3/util/settings" ) var backoff = wait.Backoff{ @@ -36,15 +33,11 @@ var backoff = wait.Backoff{ type ACRServer struct { ACRServerOpts - settings *settings_util.ArgoCDSettings - log *log.Entry appInformer cache.SharedIndexInformer - appLister applisters.ApplicationLister applicationClientset appclientset.Interface // stopCh is the channel which when closed, will shutdown the Event Reporter server - stopCh chan struct{} - serviceSet *ACRServerSet + stopCh chan struct{} } type ACRServerSet struct{} @@ -100,12 +93,10 @@ func (a *ACRServer) healthCheck(_ *http.Request) error { // Init starts informers used by the API server func (a *ACRServer) Init(ctx context.Context) { go a.appInformer.Run(ctx.Done()) - svcSet := newApplicationChangeRevisionServiceSet() - a.serviceSet = svcSet } func (a *ACRServer) RunController(ctx context.Context) { - controller := acr_controller.NewApplicationChangeRevisionController(a.appInformer, a.Cache, a.ApplicationServiceClient, a.appLister, a.applicationClientset) + controller := acr_controller.NewApplicationChangeRevisionController(a.appInformer, a.ApplicationServiceClient, a.applicationClientset) go controller.Run(ctx) } @@ -164,10 +155,6 @@ func (a *ACRServer) Listen() (*Listeners, error) { // golang/protobuf). func (a *ACRServer) Run(ctx context.Context, lns *Listeners) { httpS := a.newHTTPServer(ctx, a.ListenPort) - tlsConfig := tls.Config{} - tlsConfig.GetCertificate = func(_ *tls.ClientHelloInfo) (*tls.Certificate, error) { - return a.settings.Certificate, nil - } go func() { a.checkServeErr("httpS", httpS.Serve(lns.Main)) }() go a.RunController(ctx) @@ -179,7 +166,7 @@ func (a *ACRServer) Run(ctx context.Context, lns *Listeners) { <-a.stopCh } -// NewServer returns a new instance of the Event Reporter server +// NewApplicationChangeRevisionServer returns a new instance of the Event Reporter server func NewApplicationChangeRevisionServer(_ context.Context, opts ACRServerOpts) *ACRServer { appInformerNs := opts.Namespace if len(opts.ApplicationNamespaces) > 0 { @@ -188,19 +175,12 @@ func NewApplicationChangeRevisionServer(_ context.Context, opts ACRServerOpts) * appFactory := appinformer.NewSharedInformerFactoryWithOptions(opts.AppClientset, 0, appinformer.WithNamespace(appInformerNs), appinformer.WithTweakListOptions(func(_ *metav1.ListOptions) {})) appInformer := appFactory.Argoproj().V1alpha1().Applications().Informer() - appLister := appFactory.Argoproj().V1alpha1().Applications().Lister() server := &ACRServer{ ACRServerOpts: opts, - log: log.NewEntry(log.StandardLogger()), appInformer: appInformer, - appLister: appLister, applicationClientset: opts.AppClientset, } return server } - -func newApplicationChangeRevisionServiceSet() *ACRServerSet { - return &ACRServerSet{} -} diff --git a/acr_controller/service/acr_service_test.go b/acr_controller/service/acr_service_test.go index 4ca8dbc60ff2f..f1a451a89f995 100644 --- a/acr_controller/service/acr_service_test.go +++ b/acr_controller/service/acr_service_test.go @@ -229,22 +229,22 @@ func Test_getRevisions(r *testing.T) { r.Run("history list is empty", func(t *testing.T) { acrService := newTestACRService(&mocks.ApplicationClient{}) current, previous := acrService.getRevisions(r.Context(), createTestApp(fakeApp)) - assert.Equal(t, "", current) - assert.Equal(t, "", previous) + assert.Empty(t, current) + assert.Empty(t, previous) }) r.Run("history list is empty, but operation happens right now", func(t *testing.T) { acrService := newTestACRService(&mocks.ApplicationClient{}) current, previous := acrService.getRevisions(r.Context(), createTestApp(fakeAppWithOperation)) assert.Equal(t, "c732f4d2ef24c7eeb900e9211ff98f90bb646505", current) - assert.Equal(t, "", previous) + assert.Empty(t, previous) }) r.Run("history list contains only one element, also sync result is here", func(t *testing.T) { acrService := newTestACRService(&mocks.ApplicationClient{}) current, previous := acrService.getRevisions(r.Context(), createTestApp(syncedAppWithSingleHistory)) assert.Equal(t, "c732f4d2ef24c7eeb900e9211ff98f90bb646505", current) - assert.Equal(t, "", previous) + assert.Empty(t, previous) }) r.Run("application is synced", func(t *testing.T) { diff --git a/cmd/application-change-revision-controller/commands/application_change_revision_controller.go b/cmd/application-change-revision-controller/commands/application_change_revision_controller.go index df084a9a2fc35..9ee8e67a6f78b 100644 --- a/cmd/application-change-revision-controller/commands/application_change_revision_controller.go +++ b/cmd/application-change-revision-controller/commands/application_change_revision_controller.go @@ -126,13 +126,9 @@ func NewCommand() *cobra.Command { lns, err := changeRevisionServer.Listen() errors.CheckError(err) for { - var closer func() ctx, cancel := context.WithCancel(ctx) changeRevisionServer.Run(ctx, lns) cancel() - if closer != nil { - closer() - } } }, } diff --git a/server/application/application_rollout_rollback.go b/server/application/application_rollout_rollback.go index be0ffcaba4aa0..ec96a28190b9c 100644 --- a/server/application/application_rollout_rollback.go +++ b/server/application/application_rollout_rollback.go @@ -79,22 +79,22 @@ func (s *Server) getRsOfSpecificRevision(ctx context.Context, config *rest.Confi return nil, fmt.Errorf("error getting resource: %w", err) } - if v := resource.GetRevision(rsliveObj); err == nil { - if toRevision == 0 { - if latestRevision < v { - // newest one we've seen so far - previousRevision = latestRevision - previousReplicaSet = latestReplicaSet - latestRevision = v - latestReplicaSet = rsliveObj - } else if previousRevision < v { - // second newest one we've seen so far - previousRevision = v - previousReplicaSet = rsliveObj - } - } else if toRevision == v { - return rsliveObj, nil + v := resource.GetRevision(rsliveObj) + switch toRevision { + case 0: + if latestRevision < v { + // newest one we've seen so far + previousRevision = latestRevision + previousReplicaSet = latestReplicaSet + latestRevision = v + latestReplicaSet = rsliveObj + } else if previousRevision < v { + // second newest one we've seen so far + previousRevision = v + previousReplicaSet = rsliveObj } + case v: + return rsliveObj, nil } } @@ -139,7 +139,7 @@ func (s *Server) getReplicaSetForRolloutRollack(ctx context.Context, config *res rolloutGVK := getRolloutGVK() foundRolloutNode := tree.FindNode(rolloutGVK.Group, rolloutGVK.Kind, q.GetRolloutNamespace(), q.GetRolloutName()) - if foundRolloutNode == nil || foundRolloutNode.ResourceRef.UID == "" { + if foundRolloutNode == nil || foundRolloutNode.UID == "" { return nil, status.Errorf(codes.InvalidArgument, "%s %s %s not found as part of application %s", rolloutGVK.Kind, rolloutGVK.Group, q.GetRolloutName(), q.GetName()) } diff --git a/server/application/application_validate_src_and_dest.go b/server/application/application_validate_src_and_dest.go index 6b339ab4bbf35..94eb1f8033242 100644 --- a/server/application/application_validate_src_and_dest.go +++ b/server/application/application_validate_src_and_dest.go @@ -35,7 +35,7 @@ func (s *Server) ValidateSrcAndDst(ctx context.Context, requset *application.App if err := validateDestination(ctx, &app.Spec.Destination, s.db); err != nil { entity := destinationEntity - errMsg := fmt.Sprintf("application destination spec for %s is invalid: %s", app.ObjectMeta.Name, err.Error()) + errMsg := fmt.Sprintf("application destination spec for %s is invalid: %s", app.Name, err.Error()) return &application.ApplicationValidateResponse{ Error: &errMsg, Entity: &entity, @@ -53,7 +53,7 @@ func (s *Server) ValidateSrcAndDst(ctx context.Context, requset *application.App } if len(conditions) > 0 { entity := sourceEntity - errMsg := fmt.Sprintf("application spec for %s is invalid: %s", app.ObjectMeta.Name, argo.FormatAppConditions(conditions)) + errMsg := fmt.Sprintf("application spec for %s is invalid: %s", app.Name, argo.FormatAppConditions(conditions)) return &application.ApplicationValidateResponse{ Error: &errMsg, Entity: &entity, diff --git a/server/application/cf_application.go b/server/application/cf_application.go index 7f6785885539b..40d04210dd5e2 100644 --- a/server/application/cf_application.go +++ b/server/application/cf_application.go @@ -12,7 +12,7 @@ import ( appv1 "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" "github.com/argoproj/argo-cd/v3/reposerver/apiclient" "github.com/argoproj/argo-cd/v3/util/app/path" - ioutil "github.com/argoproj/argo-cd/v3/util/io" + utilio "github.com/argoproj/argo-cd/v3/util/io" ) const ( @@ -41,7 +41,7 @@ func (s *Server) GetChangeRevision(ctx context.Context, in *application.ChangeRe if err != nil { return nil, fmt.Errorf("error creating repo server client: %w", err) } - defer ioutil.Close(closer) + defer utilio.Close(closer) response, err := client.GetChangeRevision(ctx, &apiclient.ChangeRevisionRequest{ AppName: in.GetAppName(), diff --git a/util/exec/exec_test.go b/util/exec/exec_test.go index 89e582e1fcbcf..d8113ce260762 100644 --- a/util/exec/exec_test.go +++ b/util/exec/exec_test.go @@ -203,9 +203,9 @@ func TestRunInDir(t *testing.T) { } func TestRedact(t *testing.T) { - assert.Equal(t, "", Redact(nil)("")) - assert.Equal(t, "", Redact([]string{})("")) - assert.Equal(t, "", Redact([]string{"foo"})("")) + assert.Empty(t, Redact(nil)("")) + assert.Empty(t, Redact([]string{})("")) + assert.Empty(t, Redact([]string{"foo"})("")) assert.Equal(t, "foo", Redact([]string{})("foo")) assert.Equal(t, "******", Redact([]string{"foo"})("foo")) assert.Equal(t, "****** ******", Redact([]string{"foo", "bar"})("foo bar")) diff --git a/util/kustomize/repospec.go b/util/kustomize/repospec.go index 839483795ee86..3fa38cdc443f2 100644 --- a/util/kustomize/repospec.go +++ b/util/kustomize/repospec.go @@ -34,7 +34,7 @@ func parseGitURL(n string) ( index := strings.Index(n, gitSuffix) orgRepo = n[0:index] n = n[index+len(gitSuffix):] - if len(n) > 0 && n[0] == '/' { + if n != "" && n[0] == '/' { n = n[1:] } path, gitRef = peelQuery(n) diff --git a/util/kustomize/repospec_test.go b/util/kustomize/repospec_test.go index 1a18064071033..34d586e5d00a6 100644 --- a/util/kustomize/repospec_test.go +++ b/util/kustomize/repospec_test.go @@ -43,7 +43,7 @@ var hostNamesRawAndNormalized = [][]string{ } func makeURL(hostFmt, orgRepo, path, href string) string { - if len(path) > 0 { + if path != "" { orgRepo = filepath.Join(orgRepo, path) } url := hostFmt + orgRepo